目前,我正在研究API包装器。如果我发送错误Consumer Key
,服务器将在标头中返回Status
403 Forbidden
。它还将传递自定义标头。如何实际检索这些自定义标题?
这是从服务器收到的响应。
Cache-Control: private
Date: Wed, 01 May 2013 14:36:17 GMT
P3P: policyref="/w3c/p3p.xml", CP="ALL CURa ADMa DEVa OUR IND UNI COM NAV INT STA PRE"
Server: Apache/2.2.23 (Amazon)
Status: 403 Forbidden
X-Error: Invalid consumer key.
X-Error-Code: 152
X-Powered-By: PHP/5.3.20
Connection: keep-alive
我需要检索X-Error
和X-Error-Code
。目前,我正在使用HttpClient
类来处理请求。如果我在VS Studio 2012的Quick Watch下看到标题响应,我可以像这样找到它
((System.Net.Http.Headers.HttpHeaders)(response.Headers)).headerStore["X-Error-Code"].ParsedValue
还有其他办法吗?
编辑:
headerStore
无法通过代码访问,因为这是私有字段。我只能通过Quick Watch窗口访问它。
这是我的请求代码段:
var response = await _httpClient.PostAsync("/v3/oauth/request", content);
答案 0 :(得分:36)
好吧,HttpResponseMessage.Headers
会返回HttpResponseHeaders
引用,因此您应该可以使用GetValues()
string error = response.Headers.GetValues("X-Error").FirstOrDefault();
string errorCode = response.Headers.GetValues("X-Error-Code").FirstOrDefault();
答案 1 :(得分:12)
由于问题的标题是“检索所有标题”,我想添加一个答案。
HttpClient
方法返回的HttpResponseMessage
有两个标题属性:
HttpResponseMessage.Headers
是HttpResponseHeaders
,具有通用响应标头HttpResponseMessage.Content.Headers
是一个HttpContentHeaders
,其中包含Content-Type
两个对象都实现了IEnumerable<KeyValuePair<string, IEnumerable<string>>
,因此您可以轻松地将所有标题组合成这样的内容:
var responseMessage = await httpClient.GetAsync(url);
var headers = responseMessage.Headers.Concat(responseMessage.Content.Headers);
答案 2 :(得分:8)
我试图找到一个不存在的标题时发现的问题。您应该使用TryGetValues而不是GetValues,因为在运行时,如果找不到标头,它将抛出异常。你会使用类似这样的代码:
IEnumerable<string> cookieHeader;
response.Headers.TryGetValues("Set-Cookie", out cookieHeader);
答案 3 :(得分:1)
这对我有用:
import dependency from '../../src/actions';
jest.mock('../../src/actions', () => ({
fetchDocumentsIfNeeded: jest.fn()
}));
expect(dependency.fetchDocumentsIfNeeded).toBeCalled();
答案 4 :(得分:0)
有点笨重,但易于理解。
System.Diagnostics.Debug.Write("----- CLIENT HEADERS -----" + Environment.NewLine);
foreach (KeyValuePair<string, IEnumerable<string>> myHeader in myHttpClient.DefaultRequestHeaders)
{
System.Diagnostics.Debug.Write(myHeader.Key + Environment.NewLine);
foreach(string myValue in myHeader.Value)
{
System.Diagnostics.Debug.Write("\t" + myValue + Environment.NewLine);
}
}
System.Diagnostics.Debug.Write("----- MESSAGE HEADERS -----" + Environment.NewLine);
foreach (KeyValuePair<string, IEnumerable<string>> myHeader in myHttpRequestMessage.Headers)
{
System.Diagnostics.Debug.Write(myHeader.Key + Environment.NewLine);
foreach (string myValue in myHeader.Value)
{
System.Diagnostics.Debug.Write("\t" + myValue + Environment.NewLine);
}
}
System.Diagnostics.Debug.Write("----- CONTENT HEADERS -----" + Environment.NewLine);
foreach (KeyValuePair<string, IEnumerable<string>> myHeader in myHttpRequestMessage.Content.Headers)
{
System.Diagnostics.Debug.Write(myHeader.Key + Environment.NewLine);
foreach (string myValue in myHeader.Value)
{
System.Diagnostics.Debug.Write("\t" + myValue + Environment.NewLine);
}
}