【问题标题】:php - Posting Array via CURLOPT_POSTFIELDSphp - 通过 CURLOPT_POSTFIELDS 发布数组
【发布时间】:2020-11-27 18:25:22
【问题描述】:

我通过 PHP CURL 做了大量的发布。通常,我们发布到期望直接 HTTP POST 或 JSON 的服务器。因此,我们将参数构建为一个数组...然后 json_encode 数组或 http_build_query 数组...并将结果发布到 CURLOPT_POSTFIELDS。有人为我们编写了一些网页……他们通过将数组 $_POST 发布到我们的服务器来通过辅助页面发布表单数据……它成功了!当然,我已经查看了 CURLOPT_POSTFIELDS 的规范……它可以采用字符串或数组。所以,我很困惑......为什么协议似乎是使用 http_build_query 将数组转换为字符串,而人们可以简单地发布数组(至少如果它是一维的)?这仅仅是因为 http_build_query.. 的 URL 编码附带好处还是有其他原因?

附:当数组包含一个完整 URL 的参数时,即带有查询,例如http://example.com?a=1&b=2&c=3,服务器会很好地读取数据,即使该参数没有经过 URL 编码......或者发布一个数组会自动对元素的元素进行 urlencode数组?

【问题讨论】:

    标签: php arrays string curl php-curl


    【解决方案1】:

    您传递给 CURLOPT_POSTFIELDS 的值类型会影响您的请求的Content-type。 如果 CURLOPT_POSTFIELDS 是一个数组,则请求的内容类型将为 multipart/form-data

    如果 CURLOPT_POSTFIELDS 是一个字符串 application/x-www-form-urlencoded.

    现在发生的事情(根据您的问题)是,无论内容类型如何,PHP 都能够检测到您的 POST 参数。所以两种发送请求的方式都会通过。

    您还可以查看this question 以了解哪种情况更适合哪种情况。 Another link

    【讨论】:

    • 谢谢,@PrinceDorcis。特别是对于额外的链接。当然,我在发布之前搜索了现有的帖子。虽然找不到所有内容。
    【解决方案2】:

    通过 http(s) 传输任何数据都是在传输 strings,它是一个 text transfer 协议,即使您没有明确地将数组转换为字符串(通过 json_encode() 或 http_build_query() )cURL 也会这样做你。

    【讨论】:

    • 如果是这样,我的问题的答案是什么? http_build_query()...的目的是什么?为什么是公认的协议来使用它?
    • http_build_query 的目的是将数组数据序列化(转换为application/x-www-form-urlencoded 编码),以便通过文本传输协议进行传输。然后在另一端数据自动反序列化为数组。
    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2012-04-12
    • 2014-02-14
    相关资源
    最近更新 更多