HTTP请求在Postman中有效,但在C#代码中无效

iyfjxgzm  于 2023-03-02  发布在  Postman
关注(0)|答案(8)|浏览(1224)

我想用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.

也很抱歉这么多的图像..我不知道如何显示在其他方式的问题。

ehxuflar

ehxuflar1#

在Postman的右边应该有一个叫做code的链接。点击它然后选择C#来得到Postman生成的代码。粘贴进去试试。

rkkpypqq

rkkpypqq2#

对我来说,问题是C#中的TLS设置。请尝试在应用的开头或HTTP请求代码之前添加这一行:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
gt0wga4j

gt0wga4j3#

我知道这个老,但要获得相同的C#代码作为 Postman 发送,让 Postman 生成的代码,但首先你必须从nuget或从PM控制台类型的RestSharp库:
安装包RestRequest-版本1.2.0
步骤:
1-从 Postman 处调用您的rest api
2-按下代码按钮

3-将打开一个弹出窗口,然后选择您想要的任何语言,在您的情况下,它是C#

5uzkadbs

5uzkadbs4#

我的建议是从postman和C#应用程序中检索原始请求字符串,并使用类似https://text-compare.com/的东西来查找差异。我猜测有一些非常微小的差异,如额外的斜线,用普通的眼睛很难注意到。

5t7ly7z5

5t7ly7z55#

只是为了帮助任何人搜索-可能有多种原因造成这样的错误。

帮助调试此类问题的步骤。

1.下载Fiddler(或Wireshark等等效软件)以记录网络流量。
1.通过 Postman 发出工作请求(记录交通流量)
1.通过C#发出失败请求(记录流量)
1.看看这两个请求有什么不同。
在我的例子中,我在认证中得到了引号,这是一个微妙的区别,直到我比较了两者,我才意识到
工作呼叫(200 OK)

呼叫失败(401未授权)

hkmswyz6

hkmswyz66#

下一步是比较来自C#代码和Postman的原始请求和响应,将它们并排放置并比较差异--我向您保证至少会有一个差异。:-)
403authorization problem,因此该标记将是第一个可疑对象,因为您的请求的错误结构更可能引发400“Bad request”错误。
不过在这个特殊的例子中,我已经在我的机器上使用Flurl运行了VS 2019中的代码,它看起来运行得很好。

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
6l7fqoea

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我建立允许这两种情况,没有重定向应该是必要的。但最后,我只是改变了网址为“../属性/?等...”和问题消失了。

z5btuh9x

z5btuh9x8#

我也遇到过类似的问题,但这里的所有答案都不起作用。我在C#客户端上安装了403,但它在Postman上运行良好。几个小时后,我按照@JsAndDotNet的建议使用fiddler,我发现服务器在没有User-Agent的情况下会反弹所有请求。
一种确认的方法是检查响应,在我的例子中,响应应该是json格式的,但是我得到了一个text/html,这表明服务器认为我的请求是从浏览器发出的,因此阻止了它。
指定我自己的User-Agent(任何随机字符串)解决了这个问题

相关问题