使用承载令牌在 C# 中构建 post HttpClient 请求

Posted

技术标签:

【中文标题】使用承载令牌在 C# 中构建 post HttpClient 请求【英文标题】:Building post HttpClient request in C# with Bearer Token 【发布时间】:2021-03-09 11:19:38 【问题描述】:

我并不是真正的 C# 专家,我有一个 C# 中的 httpRequest 帖子要开发,为此我创建了这个方法,它需要一个 Uri、一个对象和一个不记名令牌。

此方法旨在构建调用请求:

private HttpClient client = new HttpClient(); 
public async Task<UserResponse> CreateUser(Uri url, UserRequest userRequest, string token)

        
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");


    string requestObject = JsonConvert.SerializeObject(userRequest);
    Console.WriteLine("My Object: " + requestObject);
    var req = new HttpRequestMessage(HttpMethod.Post, url);
    req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
    req.Content = new StringContent(
        requestObject,
        Encoding.UTF8,
        "application/json"
    );

    Console.WriteLine(req.ToString());
    var response = await client.SendAsync(req); 
        
    string output = await response.Content.ReadAsStringAsync();
    Console.WriteLine(JsonConvert.DeserializeObject(output));

    UserResponse returnValue = JsonConvert.DeserializeObject<UserResponse>(output);
    return returnValue;

我的问题是我不确定我是否正确传递了我的标题内容。返回响应是一条错误消息,告诉我未通过身份验证。

谢谢

【问题讨论】:

看起来不错。不记名令牌是否需要以某种方式编码(例如 base64)? gist.github.com/bryanbarnard/8102915 我不这么认为....我确实尝试过使用 Postman,但没有遇到问题。 如果您在 Postman 中有一个工作示例,那么打开 Fiddler,比较您的 C# 代码和 Postman 发送的请求,找出差异 我在这里找到了解决方案:***.com/questions/51076479/… 似乎需要结束反斜杠... 【参考方案1】:

你必须以这种方式添加令牌:

var baseAddress = "http://....";
var api = ".....";
client.BaseAddress = new Uri(baseAddress);

var contentType = new MediaTypeWithQualityHeaderValue("application/json");

client.DefaultRequestHeaders.Accept.Add(contentType);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

var postData = JsonConvert.SerializeObject(userRequest);
contentData = new StringContent(postData, Encoding.UTF8, "application/json");

var response = await client.PostAsync(baseUrl + api, contentData);

if (response.IsSuccessStatusCode)

var stringData = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<UserResponse>(stringData);

else


【讨论】:

以上是关于使用承载令牌在 C# 中构建 post HttpClient 请求的主要内容,如果未能解决你的问题,请参考以下文章

csharp REST呼叫C#承载令牌POST

如何使用授权承载 + 令牌使用 Axios 注销用户

Web Api 2 Preflight CORS 请求承载令牌

HttpClient中的授权承载令牌?

如何在 c# 应用程序中正确保护 api 凭据

向后端发送无效承载令牌时如何记录