ZiBaT
=> Peter Levinsky
=> 3.sem => projekt |
PROJEKT |
Updated : 2018-02-12
|
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:
Denne opgave har alle 5 trin
Målet er at du kan designe og implmentere en REST provider service, såvel som konsumere den.
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
Opret et nyt projekt 'CSRest', vælg WCF -> Web Service Application og klik OK
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.
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.
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>
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
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">
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å
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
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.
For at consumere en REST service fra et 'almindeligt' program skal du gøre noget tilsvarende dette:
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;
}
}
For at fuldføre en 'normal' REST serrvice vil du ofte finde følgende metoder:
Altså:
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;
}
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.