我想通过 HttpClient
向外部 API 发送请求来自我自己的 C# 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);
从我的请求 header 中删除了授权 header ,我收到了 UnAuthorized http 错误。我知道发生重定向时,出于安全原因删除了授权 header 。此外,我不确定外部 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 方法不允许和错误详细信息如下:
{ "detail": "Method "GET" not allowed."}
外部 API 方法是
PUT
.但在这里我得到了 GET
错误。我在 postman 中尝试了很多选项,最后我在 postman 中找到了选项:
当我打开它时,外部 API 工作正常。
我也用
Insomnia
测试它它工作正常。它是否与我的代码或 dot net 5 或我的代码中的其他内容有关,或者与外部 API 相关?
如果它与我的代码有关,我该如何解决错误?
如果错误与外部 API 相关,为什么 Postman 和 Insomnia 响应正常?
外部 API 具有针对特定域的核心策略,我从其他域发送请求。
我所知道的是在浏览器中应用的 CORS 策略。不在 Postman、Insomnia 或 C# 代码中。
怎么样
CORS
?是否与CORS
有关?如果是,我该怎么办?我将不胜感激您的回答。
更新
我检测到
WWW-Authenticate: JWT realm="api"
在响应头中。究竟是什么?我该怎么办?
最佳答案
您在重定向后删除授权 header 是正确的。但请记住,这种行为是 HttpClient
设计的一部分。在 C# 中。 Postman 和 Insomnia 可能有不同的机制来发送由重定向引起的每个连续请求的授权 header 。您在 Postman
中启用的选项将使它使用您指定的原始 HTTP 方法( PUT
)作为 HTTP 方法,以根据重定向消息发送进一步的请求( postman 默认使用 GET
方法处理重定向消息指示的请求)。
您看到 301 的事实表明需要重定向。您可以查看 Location
response.Headers
中的 header 值查看真实位置并将带有授权 header 的请求直接发送到该端点。如果我是你,我不会直接使用新位置,因为原始端点是 API 的作者给你的。相反,我会以编程方式将请求发送到原始端点,并将对 301 代码的请求重新发送到新的 Location
(由于 Postman 的行为,使用 PUT
方法)直到您得到结果。这个答案可以给你一些想法:https://stackoverflow.com/a/42566541/1539231
关于发送到服务器后删除 C# HttpClient 授权 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68367640/