HttpClient的授权头以'key='开头

10
我有以下代码,并且我想将POST请求的Authorization设置为如下形式:
Authorization:key=somevalue
using (HttpClient client = new HttpClient())
{
     using (StringContent jsonContent = new StringContent(json))
     {
         jsonContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

         using (HttpResponseMessage response = await client.PostAsync("https://android.googleapis.com/gcm/send", jsonContent))
         {
            var reponseString = await response.Content.ReadAsStringAsync();
         }
     }
}

怎么做呢?我真的很困惑,还有下面这句话。
client.DefaultRequestHeaders.Add("Authorization", "key=" + apiKey);

抛出了以下异常
引用: 在用户代码中未处理的情况下,发生了类型为 'System.FormatException' 的异常,该异常发生在 System.Net.Http.dll 中。

你是否启用了“第一次机会异常”?如果是,请将其关闭。 - Yuval Itzchakov
我个人更喜欢使用 FormUrlEncodedContent 来实现这个目的,就像提交表单一样发送键和其他内容。https://msdn.microsoft.com/zh-cn/library/system.net.http.formurlencodedcontent(v=vs.118).aspx - Afzaal Ahmad Zeeshan
3个回答

27
我通过以下代码解决了这个问题。
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("key", "=" + apiKey);

1
根据HTTP客户端的存储方式,可能不支持线程安全。会产生的错误是“已添加具有相同键的项”。 - P. Roe
它是否在key=之间添加了一个空格? - TimTIM Wong
@TimTimWong 我不知道,它对我来说只是有效的 :) - Hakan Fıstık

2

不确定这是否仍在运行,但基本认证密钥和类似于64位哈希认证密钥将被添加到类似于REST调用的内容中:

var httpClient2 = new HttpClient();
var uri = new Uri("<someuri>");
var tokenKey = "<sometokenkey>");
var httpContent = new StringContent("<some body or serialized thing>", System.Text.Encoding.UTF8, "application/json");

httpClient2.BaseAddress = new Uri(uri);
httpClient2.DefaultRequestHeaders.Accept.Clear();
httpClient2.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient2.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", tokenKey);

response = await httpClient2.PostAsync(uri, httpContent);

这个解决方案非常有效。我甚至可以说是新的AuthenticationHeaderValue("Bearer", tokenKey);非常感谢! - Cees

0

我曾经遇到过同样的问题,我使用以下方法解决:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);

request.Headers["Authorization"] = "Basic jMxMTgwMWUzYWFkYTk4NjM2MjcyOTk3MDowYTU0N2I2NzliNWRkMjliN2I4NTFlMDBkY2Y2NjQzNzQ5OTIxYzZl";

Basic后面的字符串是来自Postman的编码字符串,选项为'code'。

希望这可以帮到你!


我认为这不是同一个问题,因为你正在使用 HttpWebRequest 而我正在使用 HttpClient - Hakan Fıstık

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接