Php Curl-to-GuzzleHttp请求

Php Curl-to-GuzzleHttp请求,php,curl,guzzle,Php,Curl,Guzzle,我收到了以下要求: curl-H”内容类型:application/json“-H”Api Key:someapikey“-X-d{“地址”:“30598西街”,“城市”:“Oakdale”}“PUT”https://somedomain/api/members/1234567“ 我正试图通过这样的方式复制这一点: 我不断收到415个不受支持的媒体类型响应。从给我的卷发来看,我想我已经把所有的底子都盖好了。但是,当我调试时,它显示我的内容类型设置为application/x-www-form-u

我收到了以下要求:

curl-H”内容类型:application/json“-H”Api Key:someapikey“-X-d{“地址”:“30598西街”,“城市”:“Oakdale”}“PUT”https://somedomain/api/members/1234567“

我正试图通过这样的方式复制这一点:


我不断收到415个不受支持的媒体类型响应。从给我的卷发来看,我想我已经把所有的底子都盖好了。但是,当我调试时,它显示我的内容类型设置为
application/x-www-form-urlencoded
。根据文档,仅当尚未设置内容类型标头且包含form_参数时,才会将标头设置为此。因为我已经设置了这个标题,它不应该正确切换?请帮忙

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

您可以完全从选项中省略
内容类型
标题,而是在请求中使用
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
]);

$fields中有什么?类似于so的数组
['field1'=>'value1']
根据文档和代码,form_params应仅在尚未设置的情况下更改内容类型。我认为在构造函数中设置它会很重要,但由于某些原因,它并不重要。不知道为什么。我查看了代码,其中它检查条件,并且即使在构造函数中设置了头,也没有在该点设置头。谁知道呢。但这确实有效。这就是答案。是的,医生确实这么说,但它可能已经过时或不正确。当设置form_params时,似乎将内容类型设置为urlencoded,然后基于该设置创建请求。看起来它覆盖了现有的内容类型标题。客户端中的sendAsync函数调用prepareDefaults(设置默认内容类型,然后调用transfer,后者调用applyOptions,后者根据表单参数或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
]);