我正在尝试构建一个c#控制台应用程序来测试一个使用cookie来处理各种事情的休息服务。我一直在尝试使用hammock,但它似乎无法管理Cookie。
是否有管理cookie的c#rest客户端?
答案 0 :(得分:2)
此外,RestSharp支持自动cookie管理。它使用HttpWebRequest
并使用CookieContainer
在内部执行此操作。要支持此功能,您只需在创建共享IRestClient.CookieContainer
时设置IRestClient
属性:
var client = new RestClient("http://api.server.com/")
{
CookieContainer = new CookieContainer();
};
完成此操作后,对Execute
/ Execute<T>
/ ExecuteAsync
/ ExecuteAsync<T>
的后续调用将按预期处理Cookie。
答案 1 :(得分:1)
你能使用HttpWebReqest吗?如果是,则使用CookieContainer
类进行cookie处理。
有关详细信息,请参阅此相关问题:Automatic Cookie Handling C#/.NET HttpWebRequest+HttpWebResponse
答案 2 :(得分:1)
您可以在Hammock上处理Cookie。虽然它在代码中看起来并不自然,但它确实有效。您必须在每个响应上手动保存cookie,并在每个后续请求中对其进行处理。这是我在使用Web服务的类上使用的代码的一部分。在其他方法中,我不是调用RestClient.Request(),而是调用_Request(),以便每次发出一个请求时都会处理cookie。
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;
}
}
答案 3 :(得分:0)
我个人认为Steve Haigh's answer要容易得多,但如果你足够顽固,可以使用WebClient
并使用Headers
和ResponseHeaders
属性。其余的请求本身变得更加简单和更高级别,但cookie操作变得更加痛苦。
这让我觉得这是一次糟糕的交易,但我建议将其作为史蒂夫建议的替代品,你不喜欢这样做。
如果您想编写一个WebClient包装类来为您执行此操作,您可能会发现Jim's WebClient class有用作为起点。