【问题标题】:How to call bitly v4 api to shorten url using httpclient c#?如何使用httpclient c#调用bitly v4 api来缩短url?
【发布时间】: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://stackoverflow.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://stackoverflow.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

标签: c# asp.net asp.net-mvc api asp.net-web-api


【解决方案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://stackoverflow.com/questions/ask"
};
        
//HTTP POST
var resp = await client.PostAsJsonAsync("https://api-ssl.bitly.com/v4/shorten", content);
Console.WriteLine(await resp.Content.ReadAsStringAsync());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 2021-08-22
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多