Accueil > .Net, ASP.Net, C#, Internet, WCF > [C#] WebService – REST

[C#] WebService – REST

Dans le billet précédent, on avait vu comment faire du Web Service, notamment avec WCF.

Dans ce cas là, il était destiné à être utilisé en web service via SOAP (avec une enveloppe).
Cependant, il peut arriver que l’on ait besoin d’avoir un service qui renvoie uniquement un flux XML. Par exemple, un composant JQuery qui appelle un web service et le traire en JSON.

Dans ce cas, l’enveloppe est totalement superflue et même gênante.
Comment faire ?
Et bien, utiliser REST. La différence majoritaire entre SOAP et REST, c’est que ce dernier ne possède que le corps du message, directement au format XML et que l’on peut attaquer le web service directement via URL.

L’implémentation…
Comme pour un service WCF, on va commencer par créer le contrat.

[ServiceContract(Namespace = "http://www.kerrubin.com/Test/2011/05", Name="RestService")]
public interface IRestService
{
	[OperationContract]
    [WebGet(UriTemplate = "Amazing?Name={name}", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
	string DoSomthingAmazing(string name);
}

Il est volontairement très simpliste.
Voyons dans le détail…
Les attributs ServiceContract et OperationContract sont censés être connus.
Le nouvel attribut est System.ServiceModel.Web.WebGet.
L’UriTemplate est la manière d’attaquer le service via URL, ici, on utilisera donc l’URL : RestService.svc/Amazing?Name=Kerrubin
On peut bien sûr mettre plusieurs paramètres, en cas de besoin.

Pour le service en lui-même :

public class RestService : IRestService
{
    public string DoSomthingAmazing(string name)
    {
        return String.Format("{0} have done something amazing!", name);
    }
}

Pas très dur, non ?

Après, il reste la configuration :

  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webHttp"><!-- Pour REST -->
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="publishMetaData"><!-- Permet de publier les méta données (WSDL) -->
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  <services>
    <service behaviorConfiguration="publishMetaData" name="RestService">
      <endpoint address="" behaviorConfiguration="webHttp" binding="webHttpBinding"
          contract="IRestService" /><!-- Endpoint spécifique pour REST -->
      <endpoint address="soap" binding="basicHttpBinding" contract="IRestService" /><!-- Endpoint pour un client SOAP -->
    </service>
  </services>
 </system.serviceModel>

Donc, on voit bien, ici, que l’on peut faire cohabiter un service classique SOAP avec un service REST.

Cependant, une limitation très importante : avec un service WCF, on peut créer sérialiseur custom, Inspector…
Avec REST, il faut oublier, ce n’est juste pas possible, ce n’est juste pas (encore ?) prévu pour.

Voilà, cela termine la première approche avec les web services.

Une petite chose encore. C’est très con, mais j’ai testé pour le fun.
Il est tout à fait possible de faire cohabiter service asmx, WCF et REST sur la même classe. On aura donc un contrat avec les attributs WCF (ServiceContract, OperationContract et WebGet) et une classe d’implémentation avec les attributs de l’asmx (WebService & WebMethod). Quant aux objets, ils auront les attributs des deux (DataContract + DataMember et XmlElement).
Ca sert strictement à rien, mais c’est quand même bon à savoir ! ^^

Catégories :.Net, ASP.Net, C#, Internet, WCF
  1. Aucun commentaire pour l’instant.
  1. 17/01/2012 à 19:51
  2. 31/12/2012 à 16:04

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :