问题描述
我想通过 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)
};
我决定在 Postman 中测试代码。默认情况下,当我在 Postman 中调用 API 时,我收到了 http 错误 405 方法不允许和错误详细信息如下:
{ "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"
。
究竟是什么?我该怎么办?
解决方法
由于您看到 WWW-Authenticate: JWT realm="api" 标头,因此外部 API 需要 JWT 令牌身份验证,而不是基本身份验证。我认为首先您可能需要检查外部 api 的文档。
,您在重定向后删除授权标头是正确的。但请记住,此行为是 C# 中 HttpClient
设计的一部分。 Postman 和 Insomnia 可能有不同的机制来发送由重定向引起的每个连续请求的授权标头。您在 Postman
中启用的选项将使其使用您指定的原始 HTTP 方法 (PUT
) 作为 HTTP 方法根据重定向消息发送进一步的请求(邮递员使用 GET
方法默认情况下,重定向消息指示的请求)。
您看到 301 的事实表明需要重定向。您可以检查 Location
中的 response.Headers
标头值以查看真实位置并将带有授权标头的请求直接发送到该端点。如果我是你,我不会直接使用新位置,因为原始端点是 API 的作者给你的。相反,我会以编程方式将请求发送到原始端点,然后将 301 代码上的请求重新发送到新的 Location
(由于 Postman 的行为而使用 PUT
方法),直到您得到结果。这个答案可以给你一些想法:https://stackoverflow.com/a/42566541/1539231
我发现了问题。这真的很荒谬。
当我使用像 www.abc.com/api/something
这样的 URL 时,请求会收到 301 错误,邮递员会发送另一个像 www.abc.com/api/something/
这样的请求。区别只是在请求结束时 /
。
我在邮递员中尝试了新的 URL,第一个请求没问题。
另外我在我的 C# 代码中尝试了 URL,再次确定。
但我不明白为什么。
非常感谢亲爱的@pharaz-fadaei