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

如何使用C# HttpClient调用Bitly v4 API生成短链接

解决方案

问题原因

你现有代码的核心错误有两个:

  1. 误用PostAsJsonAsync方法:该方法会自动将传入的对象序列化为JSON格式的请求体,你提前将匿名对象序列化为字符串再传入,会导致请求体被二次序列化,不符合Bitly API的参数要求。
  2. 未读取响应内容:你只获取到了HttpResponseMessage状态对象,实际的接口返回数据存储在该对象的Content属性中,需要手动读取提取。
  3. 直接使用Wait()处理异步任务容易引发线程上下文死锁,建议优先使用await做异步等待。

修复后实现代码

推荐异步实现(性能最优,无死锁风险)

注意:HttpClient建议全局静态复用,不要每次请求都新建销毁,避免套接字资源耗尽。

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

public class BitlyService
{
    // 静态单例HttpClient
    private static readonly HttpClient _bitlyClient = new HttpClient();
    private readonly string _accessToken;

    public BitlyService(string accessToken)
    {
        _accessToken = accessToken;
        // 初始化公共请求头,仅执行一次
        _bitlyClient.DefaultRequestHeaders.Accept.Clear();
        _bitlyClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        _bitlyClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken);
    }

    public async Task<string> GenerateShortUrlAsync(string longUrl)
    {
        var requestParam = new
        {
            long_url = longUrl
        };

        // 直接传匿名对象,PostAsJsonAsync会自动完成序列化
        var response = await _bitlyClient.PostAsJsonAsync("https://api-ssl.bitly.com/v4/shorten", requestParam);
        // 校验请求是否成功,非2xx状态码会抛出异常
        response.EnsureSuccessStatusCode();
        // 读取响应JSON字符串
        var responseContent = await response.Content.ReadAsStringAsync();
        // 可按需反序列化为强类型对象
        // var result = JsonConvert.DeserializeObject<BitlyShortenResponse>(responseContent);
        // return result.ShortLink;
        return responseContent;
    }
}

// 可选:定义强类型响应类
public class BitlyShortenResponse
{
    [JsonProperty("created_at")]
    public DateTime CreatedAt { get; set; }
    [JsonProperty("link")]
    public string ShortLink { get; set; }
    [JsonProperty("long_url")]
    public string OriginalLongUrl { get; set; }
    [JsonProperty("id")]
    public string BitlyId { get; set; }
}

同步调用实现(仅适配无法使用异步的旧代码场景)

public string GenerateShortUrlSync(string longUrl, string accessToken)
{
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
        
        var requestParam = new { long_url = longUrl };
        // 手动构造请求体,避免PostAsJsonAsync的二次序列化问题
        var jsonBody = JsonConvert.SerializeObject(requestParam);
        var httpContent = new StringContent(jsonBody, System.Text.Encoding.UTF8, "application/json");
        
        // 用GetAwaiter().GetResult()替代Wait()降低死锁风险
        var response = client.PostAsync("https://api-ssl.bitly.com/v4/shorten", httpContent).GetAwaiter().GetResult();
        response.EnsureSuccessStatusCode();
        var responseContent = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
        return responseContent;
    }
}

最佳实践提示

  • 不要泄露你的Bitly Access Token到公开代码仓库,生产环境建议存储在配置中心或环境变量中。
  • 单个应用内尽量复用同一个HttpClient实例,减少TCP连接开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 21:33:00