有点背景: 我试图将一个android应用“移植”到调用非开放式Web API的Windows Phone。由于API没有打开或记录,我使用Fiddler,运行应用程序的Android版本,并监听它所做的API调用。通用应用程序HttpClient头文件:如何禁用某些头文件?
我使用Windows.Web.Http.HttpClient作为选择的类,因为它看起来像这将是类移动而不是System.Net.Http.HttpClient。
下面是我用它来生成一个HTTP POST请求的C#代码摘录:
HttpBaseProtocolFilter _httpFilter = new HttpBaseProtocolFilter();
HttpClient _httpClient = new HttpClient(_httpFilter);
_httpClient.DefaultRequestHeaders.AcceptEncoding.Clear();
_httpClient.DefaultRequestHeaders.Accept.TryParseAdd("application/xml");
_httpClient.DefaultRequestHeaders.AcceptLanguage.TryParseAdd("en");
_httpClient.DefaultRequestHeaders.Connection.TryParseAdd("Keep-Alive");
_httpClient.DefaultRequestHeaders.Add("message-version", "1");
_httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Android|SAMSUNG- SGH-I337|3.3.1");
_httpClient.DefaultRequestHeaders.Cookie.TryParseAdd(cookie); //Some cookie values
Uri uri = new Uri(SOMEURI);
XDocument xd = new XDocument(STUFF_TO_BUILD_XML);
string xd_str = string.Concat(xd.Declaration.ToString(), xd.ToString());
xd_str = xd_str.Replace("\r\n", string.Empty);
xd_str = xd_str.Replace(" ", string.Empty);
HttpRequestMessage req_msg = new HttpRequestMessage(HttpMethod.Post, uri);
HttpStringContent strcnt = new HttpStringContent(xd_str);
req_msg.Content = strcnt;
req_msg.Content.Headers.ContentType = new Windows.Web.Http.Headers.HttpMediaTypeHeaderValue("text/xml; charset=UTF-8");
req_msg.Headers.Host = new Windows.Networking.HostName(SOMEHOSTNAME);
HttpResponseMessage rsp_msg = await _httpClient.SendRequestAsync(req_msg);
这里的原始文本使用我的代码使API调用时菲德勒认为:
POST <HTTPS endpoint> HTTP/1.1
Connection: Keep-Alive
Accept-Encoding: gzip, deflate
Host: <hostname>
Cookie2: Version=1
Accept: application/xml
message-version: 1
User-Agent: Android|SAMSUNG-SGH-I337|3.3.1
Accept-Language: en
Content-Length: 173
Content-Type: text/xml; charset=UTF-8
Cache-Control: no-cache
Cookie: STR1=VAL1; STR2=VAL2
<MESSAGE_IN_XML>
--Response--
HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked
Date: Fri, 03 Apr 2015 01:18:07 GMT
0
这里的原始文本提琴手通过Android应用程序发出请求时看到:
POST <HTTPS endpoint> HTTP/1.1
Content-Type: text/xml; charset=UTF-8
Connection: Keep-Alive
accept: application/xml
user-agent: Android|SAMSUNG-SGH-I337|3.4
message-version: 1
Accept-Language: en
Content-Length: 173
Host: <hostname>
Cookie: STR1=VAL1; STR2=VAL2
Cookie2: $Version=1
<MESSAGE_IN_XML>
--response--
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
X-Frame-Options: SAMEORIGIN
Content-Type: application/xml;charset=utf-8
Date: Fri, 03 Apr 2015 01:08:22 GMT
Content-Length: 364
<MESSAGE_IN_XML>
请参阅Fiddler的输出,我看到的唯一区别是头部中的Accept-Encoding和Cache-Control条目。有没有办法不发送它们?或者我在这里错过了什么?
请您详细说明一下吗?我不熟悉c#/通用应用程序或一般软件,因此任何细节都有帮助。谢谢 – hxdai 2015-04-03 03:50:52
最完美的学习资源来自规范。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.8。如果尽管设置了授权头文件,但您仍然可以获得401,请参阅api文档以获取正确的方式,因为有些可能仍需要来自请求有效内容(主体)的身份验证信息, – Saravanan 2015-04-03 04:04:23