2010-11-08 9 views
1

J'essaye de construire une application de console C# pour tester un service de repos qui utilise des cookies pour diverses choses. J'ai essayé d'utiliser hammock mais il ne semble pas gérer les cookies.Y a-t-il un client de repos C# qui gère les cookies?

Y a-t-il un client C# repos qui gère les cookies?

+0

êtes-vous d'essayer d'automatiser le test en testant? Fiddler a une option pour envoyer du HTTP brut que vous pouvez aussi utiliser pour REST. – Aliostad

+0

@Alostad - Je n'ai pas pour objectif de créer une bibliothèque cliente pour le service de repos, que je puisse éventuellement connecter à nunit pour exécuter des tests automatisés. Cela servira également de base pour un client Silverlight. –

Répondre

1

Pouvez-vous utiliser le HttpWebReqest? Si c'est le cas, cela a un traitement de cookie avec la classe CookieContainer.

Voir cette question connexe pour plus de détails: Automatic Cookie Handling C#/.NET HttpWebRequest+HttpWebResponse

+0

J'ai cherché à utiliser les objets HttpWebRequest et HttpWebResponse, mais ils sont un peu plus bas alors j'espérais faire face. Par exemple, Hammock a une API facile à publier des données où il me semble que je vais devoir construire une infrastructure pour faire cela avec HttpWebReqeust et HttpWebResponse. –

+0

J'ai fini par utiliser le HttpWebRequest avec le CookieContainer comme vous l'avez suggéré. –

0

Personnellement, je pense Steve Haigh's answer est beaucoup plus facile, mais si vous êtes assez têtu vous pouvez utiliser un WebClient et utiliser la propriété Headers et ResponseHeaders. Le reste se demande alors de devenir beaucoup plus simple et de plus haut niveau, mais la manipulation des cookies devient plus douloureuse. Cela me semble être un mauvais métier, mais je le suggère comme une alternative possible à la suggestion de Steve, que vous n'avez pas aimée.

Vous pouvez trouver Jim's WebClient class utile comme point de départ, si vous voulez écrire une classe WebClient wrapper pour le faire pour vous.

1

Vous pouvez gérer les cookies sur un hamac. Bien que cela ne semble pas naturel dans le code, cela fonctionne. Vous devez enregistrer manuellement les cookies sur chaque réponse et les associer à chaque requête suivante. Cela fait partie du code que j'utilise sur une classe qui consomme un service Web. Sur d'autres méthodes, au lieu d'appeler RestClient.Request(), j'appelle _Request() afin qu'il gère les cookies chaque fois que je fais une requête.

using System.Collections.Specialized; 
using Hammock; 
using System.Net; 

static class Server { 
    private static RestClient Client; 
    private static NameValueCollection Cookies; 
    private static string ServerUrl = "http://www.yourtarget.com/api"; 

    private static RestResponse _Request(RestRequest request) { 
     //If there was cookies on our accumulator... 
     if (Cookies != null) 
     { 
      // inyect them on the request 
      foreach (string Key in Cookies.AllKeys) 
      request.AddCookie(new Uri(ServerUrl), Key, Cookies[Key]); 
     } 

     // make the request 
     RestResponse response = Client.Request(request); 

     // if the Set-Cookie header is set, we have to save the cookies from the server. 
     string[] SetCookie = response.Headers.GetValues("Set-Cookie"); 

     //check if the set cookie header has something 
     if (SetCookie.Length > 0) 
     { 
      // if it has, save them for future requests 
      Cookies = response.Cookies; 
     } 

     // return the response to extract content 
     return response; 
    } 
} 
2

En outre, RestSharp prend en charge la gestion automatique des cookies. Il le fait en interne en utilisant HttpWebRequest et en utilisant CookieContainer. À cette fin, il vous suffit de définir la propriété IRestClient.CookieContainer lors de la création de votre IRestClient partagé:

var client = new RestClient("http://api.server.com/") 
{ 
    CookieContainer = new CookieContainer(); 
}; 

Une fois que vous avez fait cela, les appels suivants à Execute/Execute<T>/ExecuteAsync/ExecuteAsync<T> traitera les cookies comme prévu.