我想用C#做一个简单的HTTP请求,但是有些东西不起作用,我得到的只是403 Forbidden
状态代码。
当我尝试在Postman中做同样的请求时,一切都很好。我尝试运行Fiddler并查看Postman发送的所有标题。我复制粘贴了所有标题,但我仍然在C#代码发送的请求中得到403 Forbidden
。
C#代码(使用https://flurl.dev):
public static void Main(string[] args)
{
FlurlHttp.Configure(settings => {
settings.HttpClientFactory = new MyClientFactory();
});
var url = "https://example.com"
.AppendPathSegments(new[] { "v1", "oauth", "accesstoken" })
.SetQueryParam("grant_type", "client_credentials")
.AllowAnyHttpStatus()
.WithBasicAuth("username", "password")
.WithHeaders(new {
User_Agent = "Something/0.4.0 Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G975F Build/NRD90M)",
X_Secret_Header = "secret_encoded_value",
accept_encoding = "gzip, deflate",
Accept = "*/*"
});
HttpResponseMessage msg = url.GetAsync().Result;
Console.WriteLine("StatusCodeString: " + msg.StatusCode.ToString());
Console.WriteLine();
Console.WriteLine(msg.Content.ReadAsStringAsync().Result);
}
class MyClientFactory : DefaultHttpClientFactory
{
public override HttpMessageHandler CreateMessageHandler()
{
return new HttpClientHandler
{
AllowAutoRedirect = false
};
}
}
C#请求和响应:
Postman 请求和响应:
第一个第二个第一个第三个第一个第四个第一个
有没有人能解释一下为什么这不起作用?同样的标题,同样的一切。
- 我将URL替换为"www.example.com",因为我不想在此处显示真正的API URL。example.com" because i don't want to show the real API URL here.
也很抱歉这么多的图像..我不知道如何显示在其他方式的问题。
8条答案
按热度按时间ehxuflar1#
在Postman的右边应该有一个叫做code的链接。点击它然后选择C#来得到Postman生成的代码。粘贴进去试试。
rkkpypqq2#
对我来说,问题是C#中的TLS设置。请尝试在应用的开头或HTTP请求代码之前添加这一行:
gt0wga4j3#
我知道这个老,但要获得相同的C#代码作为 Postman 发送,让 Postman 生成的代码,但首先你必须从nuget或从PM控制台类型的RestSharp库:
安装包RestRequest-版本1.2.0
步骤:
1-从 Postman 处调用您的rest api
2-按下代码按钮
3-将打开一个弹出窗口,然后选择您想要的任何语言,在您的情况下,它是C#
5uzkadbs4#
我的建议是从postman和C#应用程序中检索原始请求字符串,并使用类似https://text-compare.com/的东西来查找差异。我猜测有一些非常微小的差异,如额外的斜线,用普通的眼睛很难注意到。
5t7ly7z55#
只是为了帮助任何人搜索-可能有多种原因造成这样的错误。
帮助调试此类问题的步骤。
1.下载Fiddler(或Wireshark等等效软件)以记录网络流量。
1.通过 Postman 发出工作请求(记录交通流量)
1.通过C#发出失败请求(记录流量)
1.看看这两个请求有什么不同。
在我的例子中,我在认证中得到了引号,这是一个微妙的区别,直到我比较了两者,我才意识到
工作呼叫(200 OK)
呼叫失败(401未授权)
hkmswyz66#
下一步是比较来自C#代码和Postman的原始请求和响应,将它们并排放置并比较差异--我向您保证至少会有一个差异。:-)
403
是authorization problem,因此该标记将是第一个可疑对象,因为您的请求的错误结构更可能引发400
“Bad request”错误。不过在这个特殊的例子中,我已经在我的机器上使用Flurl运行了VS 2019中的代码,它看起来运行得很好。
6l7fqoea7#
如果这对任何人都有帮助的话。我在调用一个API时遇到了同样的问题,并且有点不知所措,因为postman和visual studio之间包括授权头在内的所有东西看起来都完全一样。但是当我真正仔细地查看fiddler时,我注意到当使用postman时,被调用的api是https://api.someplace.com/properties/?pagesize=20,而在visual studio中,我使用的是https://api.someplace.com/properties?pagesize=20
请注意,“properties”和查询字符串之间没有斜线。“... properties/?...”工作正常,而“... properties?...”导致403。
我认为(如果我说错了请纠正我),实际发生的事情是在第一次http调用中,斜杠缺失,服务器用斜杠重定向到API的HTTP 301。重定向发生时,授权头没有携带在乘车中,这导致了403授权错误。
现在为什么这个重定向是必要的我不知道,任何API我建立允许这两种情况,没有重定向应该是必要的。但最后,我只是改变了网址为“../属性/?等...”和问题消失了。
z5btuh9x8#
我也遇到过类似的问题,但这里的所有答案都不起作用。我在C#客户端上安装了
403
,但它在Postman上运行良好。几个小时后,我按照@JsAndDotNet的建议使用fiddler,我发现服务器在没有User-Agent的情况下会反弹所有请求。一种确认的方法是检查响应,在我的例子中,响应应该是json格式的,但是我得到了一个text/html,这表明服务器认为我的请求是从浏览器发出的,因此阻止了它。
指定我自己的User-Agent(任何随机字符串)解决了这个问题