为什么邮递员在 HTTP GET 中发送表单数据?

Why is postman sending form data in an HTTP GET?

我从 API 供应商那里收到了一个 Postman json collection,它工作得很好,但有一些东西让我感到困惑:请求是 GET 格式的,但是有一个x-www-form-urlencoded body.

URL: https://login.microsoftonline.com/d1e<secret>9563/oauth2/token

当我查看 postman-generated c# 代码时,谜团还在继续:

var client = new RestClient("https://login.microsoftonline.com/d1e...d3/oauth2/token");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("grant_type", "client_credentials");
request.AddParameter("client_id", "c06bb...79");
request.AddParameter("client_secret", "7~u...D");
request.AddParameter("resource", "https://vault.azure.net");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

注意 GET 调用的 AddParameter 结构。对我来说,这必须是一个 slight-of-hand 用于仅将这些值添加到查询字符串。但是当我查看 postman 控制台时,我看到:

在 postman 控制台中,我希望看到那些附加到 url 的参数作为查询字符串,然后一切都会变得有意义。但是你可以看到这是一个真正的 Request Body.

当我在我的 c# 代码中进行 GET 调用时,我喜欢使用简单而可靠的 WebClient object 来调用 DownloadString() 方法。但是这个方法只针对GET,没办法发送form-post风格的body,可以理解。

post 人真的发送了一个 GET 并将所有这些值作为查询字符串附加到 url 吗?我应该在我的 DownloadString() 电话中做同样的事情吗?还是这里发生了其他事情?相反,我是否应该在我的 c# 中调用 UploadString() 方法并将表单 post BODY 作为 GET 发送?

Http 协议支持向请求添加正文,但您使用的 WebClient class 不支持。大概是因为它不被认为是常态。

不过,我确信 Microsoft 有充分的理由在 OAuth 流程中使用它。那些家伙通常做事都是对的!

API 只是一个抽象,您可以将任何您想要的内容发送到 API。这取决于实现,服务器如何处理这些数据。

有些服务只考虑它需要的信息而忽略其他信息

一些服务会考虑整个请求并验证它是否只有允许的数据。允许什么取决于服务

Postman 只是一个向服务器发送数据的客户端,由您决定它应该发送哪些信息。如果您不需要任何主体,则将其保留为 none。如果您需要一些东西,请添加它。