【问题标题】:Why is postman sending form data in an HTTP GET?为什么邮递员在 HTTP GET 中发送表单数据?
【发布时间】:2021-09-13 22:23:08
【问题描述】:

我从一个 API 供应商那里收到了一个 Postman json 集合,它运行良好,但对我来说有些神秘:请求是 GET 格式,但有一个 x-www-form-urlencoded 正文。

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

当我查看 postman 生成的 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 结构。对我来说,仅仅将这些值添加到查询字符串中,这一定是一件轻而易举的事。但是当我查看邮递员控制台时,我看到:

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

当我在我的 c# 代码中进行 GET 调用时,我喜欢使用简单而可靠的 WebClient 对象来调用 DownloadString() 方法。但是这种方法仅适用于 GET,无法发送表单发布样式body,可以理解。

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

【问题讨论】:

    标签: c# http get postman


    【解决方案1】:

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

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

    HTTP GET with request body

    【讨论】:

    • 谢谢卢克。您是否认为将此请求转换为 POST 但保持其他所有内容相同,应该同样有效?如果是这样,这就是我的解决方案。
    • 如果您要发布到 login.microsoftlonline.com,这取决于 Microsoft 的实施。尝试没有坏处。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 2022-01-18
      • 2018-03-17
      • 2018-11-22
      • 2016-09-08
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多