You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Windows Server上用C#携带Bearer令牌发送Get请求并处理响应

问题描述

在Windows Server上通过C#从API获取数据,已获取到访问令牌,但在GET请求中使用Bearer令牌头时遇到问题,当前代码存在错误:

Console.WriteLine("Token API");
AccessToken token = GetToken().Result;
Console.WriteLine(String.Format("Access Token: {0}", token.access_token));

var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.access_token);

List<KeyValuePair<string, string>> requestData = new List<KeyValuePair<string, string>>();
requestData.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));

FormUrlEncodedContent requestBody = new FormUrlEncodedContent(requestData);

var request =  client.GetAsync("https://theapiendpoint.com", requestBody);
// var response = request;
var response = request.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<AccessToken>(response);

主要问题:

  • GET请求错误携带请求体,GetAsync无接受请求体的重载
  • 异步操作未用await,直接访问request.Content触发报错
  • 不确定是否该用异步函数及令牌传递方式

解决方案

1. 核心错误修正

  • 移除GET请求体:HTTP规范中GET请求通常不包含请求体,绝大多数API也不会要求GET带体,直接删除requestData和requestBody相关代码。
  • 正确处理异步操作:必须用await等待异步任务完成,否则无法获取真实的HttpResponseMessage对象。

2. 改用异步函数(推荐)

服务器环境下异步编程能避免线程阻塞,建议将逻辑改为异步方法:

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;

class Program
{
    // 异步入口点(C# 7.1及以上支持)
    static async Task Main(string[] args)
    {
        Console.WriteLine("Token API");
        // 用await替代.Result,避免死锁
        AccessToken token = await GetToken();
        Console.WriteLine($"Access Token: {token.access_token}");

        // 调用带令牌的API获取数据
        var apiData = await FetchDataFromApi(token.access_token);
        // 处理返回数据(示例:序列化打印)
        Console.WriteLine(JsonConvert.SerializeObject(apiData));
    }

    // 封装API数据获取逻辑,直接传入令牌
    static async Task<YourDataModel> FetchDataFromApi(string accessToken)
    {
        // HttpClient建议复用(可优化为静态实例),避免频繁创建耗尽Socket资源
        using var client = new HttpClient();
        // 设置Accept头为JSON格式
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        // 设置Bearer令牌授权头
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        // 发起GET请求并等待响应
        var response = await client.GetAsync("https://theapiendpoint.com");
        // 检查响应是否成功,非2xx状态码抛出异常(可根据需求自定义错误处理)
        response.EnsureSuccessStatusCode();

        // 读取响应内容并反序列化为目标模型(替换YourDataModel为实际数据结构)
        var responseContent = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<YourDataModel>(responseContent);
    }

    // 异步实现令牌获取逻辑
    static async Task<AccessToken> GetToken()
    {
        using var client = new HttpClient();
        var requestData = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("grant_type", "client_credentials"),
            // 添加client_id、client_secret等必要参数
        };
        var requestBody = new FormUrlEncodedContent(requestData);
        var response = await client.PostAsync("https://token-endpoint-url", requestBody);
        response.EnsureSuccessStatusCode();
        var content = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<AccessToken>(content);
    }
}

// 令牌模型
public class AccessToken
{
    public string access_token { get; set; }
    // 可添加expires_in等其他令牌字段
}

// API返回数据模型(根据实际返回结构调整)
public class YourDataModel
{
    // 对应API返回的字段定义
}

3. 关键说明

  • 令牌传递:直接将获取到的access_token作为参数传入异步方法FetchDataFromApi即可,无需额外处理。
  • HttpClient复用:建议将HttpClient设为静态实例复用,避免频繁创建导致的资源浪费。
  • 错误处理:response.EnsureSuccessStatusCode()会在HTTP状态码非2xx时抛出异常,可根据业务需求调整为自定义错误逻辑(如返回null或错误信息)。
  • 低版本兼容:若项目使用C#7.1以下版本,可在Main方法中用GetAwaiter().GetResult()等待异步任务,但优先推荐升级语言版本使用异步入口。

内容的提问来源于stack exchange,提问作者user2008685

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:54:29