【发布时间】:2021-07-13 18:26:08
【问题描述】:
我想通过 HttpClient 从我自己的 C# API 向外部 API 发送请求。
我正在使用 dot net 5 和基本身份验证。
这是我的代码:
var client = new HttpClient
{
BaseAddress = new Uri(baseUrl)
};
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Put, "apiUrl");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var param = JsonConvert.SerializeObject(new
{
param1="",
param2=""
});
requestMessage.Content = new StringContent(param, Encoding.UTF8, "application/json");
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.ASCII.GetBytes($"{user}:{pass}")));
HttpResponseMessage response = await client.SendAsync(requestMessage);
通常,我会这样发送 http 请求。 但现在我遇到了一些问题。
在从我的请求标头中删除行 HttpResponseMessage response = await client.SendAsync(requestMessage); 授权标头之后,我得到了 UnAuthorized http 错误。
我知道当重定向发生时,出于安全原因,授权标头被删除。我也不确定外部 API 中的重定向。
我将HttpClientHandler 和AllowAutoRedirect = false 添加到我的HttpClient
var handler = new HttpClientHandler()
{
AllowAutoRedirect = false,
};
var client = new HttpClient (handler)
{
BaseAddress = new Uri(baseUrl)
};
现在我收到重定向错误 301(永久移动)。
我决定在 Postman 中测试代码。默认情况下,当我在 Postman 中调用 API 时,出现 http 错误 405 method not allowed 和错误详情如下:
{ "detail": "不允许使用方法 "GET"。"}
外部 API 方法是 PUT。但在这里我得到了GET 错误。
我在邮递员中尝试了很多选项,最后我在邮递员中找到了选项:
当我打开它时,外部 API 工作正常。
我还用Insomnia 对其进行了测试,它工作正常。
它是否与我的代码或 dot net 5 或我的代码中的其他内容或与外部 API 相关?
如果它与我的代码有关,我该如何解决?
如果错误与外部 API 有关,为什么 Postman 和 Insomnia 响应正常?
外部 API 具有特定域的核心策略,我从其他域发送请求。
我所知道的是浏览器中应用了 CORS 策略。不在 Postman、Insomnia 或 C# 代码中。
CORS 呢?它与CORS 有关吗?如果是,我该怎么办?
我会很感激你的回答。
更新
我在响应标头中检测到 WWW-Authenticate: JWT realm="api"。
它到底是什么?我该怎么办?
【问题讨论】:
-
你试过把
client.SendAsync(requestMessage);改成client.PutAsync(requestMessage);吗? -
是的,一开始我用的是client.PutAsync(requestMessage);
标签: c# httpclient basic-authentication unauthorized www-authenticate