WebAPI通过HttpClient访问时怎么指定返回格式

WebAPI通过HttpClient访问时如何指定返回格式
本帖最后由 starfd 于 2014-11-25 22:40:31 编辑
WebAPI相关资料好难找。。。。。找资料找了半天都没找到具体的,按照经验去尝试也没尝试出结果来
求哪位大神给个结果,最好能给个实际的响应过程说明

var httpClient = new HttpClient();
string url="http://demo.com/api/demo";
var dic = new Dictionary<string, string>();
//填充Dictionary
HttpContent httpContent = new FormUrlEncodedContent(dic);
//FormUrlEncodedContent默认ContentType 为application/x-www-form-urlencoded
//httpContent 是请求的Content信息,不对应Response信息,修改不正确会导致服务端获取不到Form数据
var taskP = httpClient.PostAsync(url, httpContent );//POST
var taskG = httpClient.GetAsync(url);//GET
//问题在这里,什么时候设定响应的ContentType
HttpResponseMessage  rmP=taskP.Result;
HttpResponseMessage  rmG=taskG.Result;
//HttpResponseMessage  有个Header参数,但貌似不是设定响应类型的
//没搞懂Response响应步骤是如何的,是获取到HttpResponseMessage已经代表整个完整的响应了
//还是通过Content进行读取时才从服务端获取实际的响应数据
//但根据下面的测试设定无效,似乎可以推断在获取HttpResponseMessage时服务器已经给出响应结果了
var responseContent = rmP.Content;
responseContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/xml");//这步再设定ContentType 已经不起效果
responseContent.ReadAsStringAsync().Result;//这边永远返回的是json格式字符串



------解决思路----------------------
http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client
------解决思路----------------------
可以使用RestSharp来帮助调用web api

http://restsharp.org/

下面是sample code.  header中加入accept application/xml应该就可以了。
request.AddHeader("Accept", "application/xml")

var client = new RestClient("http://example.com");
// client.Authenticator = new HttpBasicAuthenticator(username, password);

var request = new RestRequest("resource/{id}", Method.POST);
request.AddParameter("name", "value"); // adds to POST or URL querystring based on Method
request.AddUrlSegment("id", "123"); // replaces matching token in request.Resource

// easily add HTTP Headers
request.AddHeader("header", "value");

// add files to upload (works with compatible verbs)
request.AddFile(path);

// execute the request
RestResponse response = client.Execute(request);
var content = response.Content; // raw content as string

// or automatically deserialize result
// return content type is sniffed but can be explicitly set via RestClient.AddHandler();
RestResponse<Person> response2 = client.Execute<Person>(request);
var name = response2.Data.Name;

// easy async support
client.ExecuteAsync(request, response => {
    Console.WriteLine(response.Content);
});

// async with deserialization
var asyncHandle = client.ExecuteAsync<Person>(request, response => {
    Console.WriteLine(response.Data.Name);
});

// abort the request on demand
asyncHandle.Abort();