[英]C# Http Post issue
我在以前曾经工作过的这段代码上遇到了麻烦。
public static async Task<Response> PushTest() {
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add( "Access-Token" , key ); //PROBLEM WAS HERE FOR SOME REASON
//PROBLEM CODE
//client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Access-Token" , key );
Uri url = new Uri(BaseUrl + "pushes");
Dictionary<string,string> data = new Dictionary<string, string>();
data.Add( "body" , "TestBody" );
data.Add( "title" , "TestTitle" );
data.Add( "type" , "note" );
data.Add( "email" , Email );
HttpContent jsonContent = new StringContent(JsonConvert.SerializeObject(data, new KeyValuePairConverter()), System.Text.Encoding.UTF8,"application/json");
HttpResponseMessage post = await client.PostAsync(url, jsonContent); // DEBUG POINT
// WORKS NOW
string responseString = await post.Content.ReadAsStringAsync();
// DOESNT RETURN NULL TO THE MAIN METHOD ANYMORE
return JsonConvert.DeserializeObject<Response>( responseString );
}
private static void Main( string[ ] args ) {
Task<Response> n = PushTest();
Response r = n.Result;
Console.WriteLine( "Done" );
} // DEBUG POINT
}
摘要:
本来是行不通的,因为即使有更好的Tasks和async代码,它也不会超出发布请求。
我对C#中的Async或Tasks一无所知,只有Java。 在将代码修复为建议的修复程序并专注于任务之后,实际的问题出在授权标头上。 谁知道为什么这对我来说是一个更好的答案。 改用Add()可以解决此问题。 将对此进行研究。
PushTest()
是Task<T>
因此您不需要从返回的T
创建一个新Task
(等待有意义吗?)。
尝试做
Task<PostResponse> n = PushTest();
PostResponse r = n.Result;
假设您实际上需要PostResponse,因为您的代码中没有实际使用它(提示:也许尝试返回一些东西 )。
在首次尝试设置标头值时,您使用DefaultRequestHeader.Authorization
设置标头值:
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Access-Token" , key );
这将生成一个具有Access-Token
方案和key
值作为身份验证令牌的身份验证标头。 AuthenticationHeaderValue
ctor的第一个参数是方案,而不是HTTP标头名称。
这是假设key
为foo
的结果HTTP请求:
GET http://example.com/ HTTP/1.1
Authorization: Access-Token foo
但是,基于修复代码示例的更新,而改用了.Add()
,似乎正在调用的Web api使用名为Access-Token
的自定义HTTP标头,而不是标准的Authorization
标头。 因此,当您这样做时:
client.DefaultRequestHeaders.Add( "Access-Token" , key );
它生成一个HTTP标头,称为Access-Token
,其值为key
。 再次假设key="foo"
,这将生成以下HTTP请求:
GET http://example.com/ HTTP/1.1
Access-Token: foo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.