【问题标题】:Curl to GuzzleHttp request卷曲到 GuzzleHttp 请求
【发布时间】:2016-11-02 19:15:09
【问题描述】:

我收到了以下 curl 请求:

curl -H "Content-Type:application/json" -H "Api-Key:someapikey" -X -d {"address":"30598 West Street","city":"Oakdale"}' PUT "https://somedomain/api/members/1234567"

我正在尝试使用GuzzleHttp 复制它,如下所示:

$headers = [
    'Api-Key'      => $this->apiKey,
    'Content-Type' => 'application/json',
];
$client = new Client([
    'headers' => $headers,
]);
$res = $client->put("{$this->baseUrl}/members/{$fields['vip_id']}", [
    'form_params' => $fields,
]);

我不断收到 415 Unsupported Media Type 响应。从我得到的卷曲中,我想我已经覆盖了所有的基础。但是,当我调试时,它显示我的内容类型设置为application/x-www-form-urlencoded。根据文档,仅当尚未设置 Content-Type 标头并且包含 form_params 时,才将标头设置为此。由于我已经设置了这个标题,它不应该切换正确吗?请帮忙!

【问题讨论】:

  • 你在 $fields 里有什么?
  • 这样的数组[ 'field1' => 'value1' ]

标签: php curl guzzle


【解决方案1】:

您的标头被覆盖的原因是请求的form_params 选项专门用于发送x-www-form-urlencoded 数据。

您可以从选项中完全省略 Content-Type 标头,而是在请求中使用 json 键来发送 JSON 数据。

$headers = [
    'Api-Key'      => $this->apiKey,
];
$client = new Client([
    'headers' => $headers,
]);
$res = $client->put("{$this->baseUrl}/members/{$fields['vip_id']}", [
    'json' => $fields, // causes Guzzle to set content type to application/json
                       // and json_encode your $fields
]);

【讨论】:

  • 根据文档和代码,form_params 仅应在尚未设置的情况下更改 Content-Type。我认为在构造函数中设置它会计数,但由于某种原因它不会。不知道为什么会这样。我查看了检查条件的代码,即使我在构造函数中设置了标头,也没有设置标头。谁知道。这确实有效。所以它的答案。
  • 是的,文档确实这么说,但它可能已经过时或不正确。 code 似乎在设置 form_params 时将内容类型设置为 urlencoded,然后基于此创建请求。看起来它覆盖了现有的内容类型标头。 Client 中的 sendAsync 函数调用 prepareDefaults (设置您的默认 Content-Type,然后调用 transfer 调用 applyOptions 根据 form_params 或 json 选项设置内容类型。(耸肩)
猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 2018-07-08
  • 2018-09-20
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多