如何使用httpclient c#调用bitly v4 api来缩短url?

Posted

技术标签:

【中文标题】如何使用httpclient c#调用bitly v4 api来缩短url?【英文标题】:How to call bitly v4 api to shorten url using httpclient c#? 【发布时间】:2021-10-04 02:07:17 【问题描述】:

所以我想调用 Bitly API 来缩短 URL,我可以使用 POSTMAN 和 Jquery 获得响应,但无法使用 C# 获得响应。

工作 Jquery 代码:

<script type="text/javascript">
$(function () 
    $(".createBitly").on("click", function (e) 

        e.preventDefault();

        var url = "https://***.com/questions/ask";
        var accessToken = "550ea49c78208978cbeb85ef24XXXX49874cc097";

        var params = 
            "long_url": url
        ;

        $.ajax(
            url: "https://api-ssl.bitly.com/v4/shorten",
            cache: false,
            dataType: "json",
            method: "POST",
            contentType: "application/json",
            beforeSend: function (xhr) 
                xhr.setRequestHeader("Authorization", "Bearer " + accessToken);
            ,
            data: JSON.stringify(params)
        ).done(function (data) 
            console.log(data);

        ).fail(function (data) 
            console.log(data);
        );
    );
);
</script>

我正在尝试但无法使用 C# 实现的 C# 代码:

        using (var client = new HttpClient())
        
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "550ea49c78208978cbeb85ef24XXXX49874cc097");
            var content = new
            
                long_url = "https://***.com/questions/ask"
            ;
            var model = JsonConvert.SerializeObject(content);
            
            //HTTP POST
            var postTask = client.PostAsJsonAsync("https://api-ssl.bitly.com/v4/shorten", model);
            postTask.Wait();

            var result = postTask.Result;

        

现在得到响应成功,但没有得到真正想要的数据。

我想要像进入邮递员一样的回应

如何使用 C# 实现这一点任何帮助将不胜感激。提前致谢

【问题讨论】:

“但无法实现” - 你能详细说明一下吗?究竟是什么问题?你收到任何错误信息吗? (附注:最好使用awaitthant .Result 在我看来PostAsJsonAsync 已经序列化了内容。所以尝试传递content 而不是序列化的model 另外,您可以考虑一遍又一遍地注入一个新的 HttpClient 而不是 using“HttpClient 旨在被实例化一次并在应用程序的整个生命周期中重复使用。” - Remarks in Docs 【参考方案1】:

上面分享的代码有两个问题。

1.授权标头

// This line of code ends up adding an incorrect header that looks like this: 
// Authorization: Authorization Bearer <myAccessToken>
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<myAccessToken>");

// Instead, try this
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer <myAccessToken>");

2。请求正文 PostAsJsonAsync 将第二个参数序列化为 json。所以,你不应该序列化content。而是将名为 content 的对象作为第二个参数发送。

以下是我尝试过的示例代码:

var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", $"Bearer myAccessToken");

var content = new

    long_url = "https://***.com/questions/ask"
;
        
//HTTP POST
var resp = await client.PostAsJsonAsync("https://api-ssl.bitly.com/v4/shorten", content);
Console.WriteLine(await resp.Content.ReadAsStringAsync());

【讨论】:

以上是关于如何使用httpclient c#调用bitly v4 api来缩短url?的主要内容,如果未能解决你的问题,请参考以下文章

Fiddler 没有看到来自 C# HttpClient() 的 API 调用

使用 C# HttpClient API 和 postman 测试的区别?客户端调用适用于邮递员,但不适用于 C# httpClient getAsync

C# 中的 httpClient 调用超时,而 cUrl 正在工作

如何在 C# 中包装 HttpClient 以实现可测试性

C# 中使用HttpClient读取大型Json数据集

C#中HttpClient使用注意:预热与长连接