HttpClient和设置Authorization头信息

9
我想对Basecamp API发起简单的请求,我按照提供的说明添加了示例用户代理和我的凭据,但是我不断收到403 Forbidden的响应。
我的凭据肯定是正确的,那么是我的请求/凭据设置不正确吗?
这是我有的(删除了个人信息):
var httpClient = new HttpClient();
var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("User-Agent", "MyApp [EMAIL ADDRESS]") });

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
            Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "[USERNAME]", "[PASSWORD]"))));

var response = await httpClient.PostAsync("https://basecamp.com/[USER ID]/api/v1/projects.json", content);
var responseContent = response.Content;

using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync()))
{
     Console.WriteLine(await reader.ReadToEndAsync());
}
1个回答

18

初步查看他们的文档似乎表明,projects.json 终端接受以下内容作为POST请求的主体:

{
    "name": "This is my new project!",
    "description": "It's going to run real smooth"
}

您将User-Agent作为POST请求体发送。我建议您按以下方式更改代码:

    var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "[USERNAME]", "[PASSWORD]")));
    using (var httpClient = new HttpClient())
    {
        httpClient.DefaultRequestHeaders.Add("User-Agent", "MyApp [EMAIL ADDRESS]");
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
        var response = await httpClient.PostAsJsonAsync(
            "https://basecamp.com/[USER ID]/api/v1/projects.json",
            new {
                name = "My Project",
                description = "My Project Description"
            });

        var responseContent = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseContent);
    }

根据文档,此操作会发布载荷,并将您的用户代理设置为应有的标头。


在没有集成开发环境的情况下编码,这一点或许应该提前说明一下 :) - Dean Ward
请考虑一下为什么将客户端包装在短暂的 using 中可能是不好的:https://dev59.com/xGEh5IYBdhLWcg3wTB_2 - mmlac

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