ZiBaT => Peter Levinsky => 3.sem => projekt

PROJEKT
REST-Service

Updated : 2018-02-12

Projekt-Opgave: REST service #1

Baggrund: Projekt-overblik
Generelt

For at lave en REST service skal der opsættes en REST-provider service (der kører på en web-server) og en REST-consumer Client. The RESTful service understøtter de almindelige GET, POST, PUT og DELETE request. Det skal i denne opgave gøres i 5 trin:

  1. Opret et projekt med en service og tilknyt dit library
  2. Konfigurer web.config for at gøre servicen til en RESTful WCF-service
  3. Opret og tilbyd services baseret på json
  4. Test din service med Unit test og Fiddler/Postmand
  5. Opret og implmeenter en REST consumer

Denne opgave har alle 5 trin

Mål

Målet er at du kan designe og implmentere en REST provider service, såvel som konsumere den.

Useful links for C#:

Serializable Class
https://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx

Configuration of web.config file
http://stackoverflow.com/questions/17644392/configuring-wcf-rest-services-in-web-config

CRUD-Operations
http://www.topwcftutorials.net/2014/01/crud-wcf-restful-service.html

Opgave A - Trin 1: Restful WCF-service provider

Opret et nyt projekt 'CSRest', vælg WCF -> Web Service Application og klik OK

Figur af VS-WCF window

Til projektet 'add reference' og tilfør en reference til jeres Library (fra opgave 2) f.eks. "..../CSModelLib/bin/debug/CSModelLib.dll"

Nu har du adgang til dine model klasser i din REST service.

 

Opgave B - Trin 2: Web.config file

Du har egentlig nu en SOAP service den skal du nu ændre til den bliver til en REST-service gennem manuelt at ændre web.config-filen.
Læs mere her : http://stackoverflow.com/questions/17644392/configuring-wcf-rest-services-in-web-config

Følg denne opskrift:

Åben web.config filen.

  1. Du skal tilføje et nyt end-point
  2. Erklær servicen med dets end-point – efter ‘<system.serviceModel>’ tag'et - og indsæt (HUSK at ændre your-namespace)

    <services>
    <service name="YOUR-NAMESPACE.Service1" behaviorConfiguration="ServiceBehavior">
        <endpoint address="" binding="webHttpBinding"
        contract="YOUR-NAMESPACE.IService1" behaviorConfiguration="webHttp"/>
     </service>
     </services> 

  3. Du skal tilføje en ny behavior
  4. Erklær behavior'en som - efter '‘<ServiceBehaviors>' åben tag'et - indsæt

    <behavior name="ServiceBehavior">
              <serviceMetadata httpGetEnabled="false"/>          
              <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>

    httpGetEnabled false svarer til der IKKE laves en wsdl-fil

  5. Du skal definere kommunikationen til dit end-point
  6. Erklær behavior'en som - efter '‘</ServiceBehaviors>' slut tag'et - indsæt

    <endpointBehaviors>
            <behavior name="webHttp">
              <webHttp/>
            </behavior>
    </endpointBehaviors>

Nu er du færdig.

En lille krølle på halen hvis du ikke ønsker der skal prøve at finde en wsdl-fil´(som jo ikke er der) skal du ændre følgende til false:

<serviceHostingEnvironment aspNetCompatibilityEnabled="false">

 

 

Opgave C - Trin 3: Define the GET REST service GetRound

I interfacet IService1 skal du tilføje dine 'operationer' dvs. mulige REST kald.

f.eks:

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
    UriTemplate = "round/")]   // http metoden GET, Uri '.../service1.svc/round og svar i body er json
    IList<Round> GetRounds(); // metoden

 

Dernæst skal du i Service1implementere metoden GetRounds i første omgang holdes informationerne i en statisk liste (dvs ikke database)
f.eks:

private static List<Round> rList = new List<Round>(){
new Round(......),
new Round(......)
}

Indsæt nogle værdier så du kan se der kommer noget tibage.

Nu skal du køre din REST-service, den vil så

  1. oversætte dit program,
  2. overføre det til din lokale webserver
  3. deploy'e den der
  4. starte en browser, hvorfra du kan kalde din REST service.

Du kan så se om det er liv i din REST service fra din browser (der kan sende GET request - men KUN GET) f.eks:

http://localhost:49972/Service1.svc/round

 

Opgave D - Trin 4: Test din REST service

Når vi skal teste en service kan vi se på 'Component test' eller også kaldet Unit test, samt integration test.

For at sikre dig at funktionaliteten i din service virker skal du lave en component test
dvs. Højre klik på Service1 klassen og generer en unit test, opstil forskellige test cases dvs. test-metoder til at afprøve din service.

For at sikre at din navigering (URI'er) til REST servicen virker skal du lave en integratins test.
Dette kan i letvægts udgaven gøres ved at anvende Fiddler4 eller Postman, hvor du kan bygge 'compose' dine egne REST forespørgelse
altså både GET, PUT, POST og DELETE.

 

Opgave E - Trin 5: Consumer RestRoundClient

For at consumere en REST service fra et 'almindeligt' program skal du gøre noget tilsvarende dette:

  1. Lav et consol applikation 'CSRestConsumer'
  2. Add en reference til
  3. dit model library
  4. Lav en klasse RestComsumer, samt en Start() metode.
  5. Lav et objekt af RestConsumer i Main og kald metoden Start.
  6. I start metoden kald en metode HentAlleRounds, der returnere en liste af Round, som så kan skrives ud.
  7. Lav metoden HentAlleRounds lidt som dette:
  8. public List<Round> HentAlleRounds()
    {
         using (HttpClient client = new HttpClient())
        {
              string jsonStr = client.GetStringAsync(RoundUri).Result; // info fra body
              List<Round> gList = JsonConvert.DeserializeObject<List<Round>>(jsonStr);
              return gList;
        }
    }

 

Opgave F: Flere metoder

For at fuldføre en 'normal' REST serrvice vil du ofte finde følgende metoder:

  1. Round GetRound(int id)
           Returnere en 'Round' med den angivede id.
  2. Round DeleteRound(int id)
           Sletter en 'Round' med den angivede id.
  3. bool InsertRound(Round r)
           Indsætter en Round objekt i listen.
  4. bool UpdateRound(Round r, int id)
          Finder en 'Round' med den angivede id og giver de nye værdier fra Round objektet

  5. Altså:

    1. Tilføj de 4 operationer i interfacet
    2. Implementer dem i Servicen
    3. Test dem med unit test
    4. Prøv med Fiddler/Postman
    5. Kald dem fra Client programmet

     

    MHT til kald fra program Husk når et objekt skal sendes med i requestet -> skal det json indkodes

    Og når der kommer svar fra PUT,POST eller DELETE skal du selv pakke det ud

    f.eks.

    public bool IndsætRound(Round round)
    {
       using (HttpClient client = new HttpClient())
       {
          // build request
          String json = JsonConvert.SerializeObject(round);
          StringContent content = new StringContent(json);
          content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

          // send request
          var resultMessage = client.PostAsync(RoundUri, content).Result;

          // decode response
          if (resultMessage.IsSuccessStatusCode)
          {
             string resultStr = resultMessage.Content.ReadAsStringAsync().Result;
             bool res = JsonConvert.DeserializeObject<bool>(resultStr);
             return res;
          }
       }
       return false;
    }

    Opgave G: Flere Klasser

    I vores CS domaine mangler klasserne Scenario, Match, Tournemant, som alle kan være REST services.
    Det er et ensartet og stort arbejde så egentligt har du vist du kan men der er små udfordringer f.eks. en Match består af Scenarios,
    så hvordan repræsenteres de over en REST-service.