如何使用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# 实现这一点任何帮助将不胜感激。提前致谢
【问题讨论】:
“但无法实现” - 你能详细说明一下吗?究竟是什么问题?你收到任何错误信息吗? (附注:最好使用await
thant .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