php - Guzzle:“标头值必须是标量”
问题描述
我只是想在一个新系统上实现 Guzzle,我收到以下错误消息:
PHP Fatal error: Uncaught InvalidArgumentException: Header value must be scalar or null but array provided. in /var/www/html/lvmh/vendor/guzzlehttp/psr7/src/MessageTrait.php:191
Stack trace:
#0 [internal function]: GuzzleHttp\\Psr7\\Request->GuzzleHttp\\Psr7\\{closure}(Array)
#1 /var/www/html/lvmh/vendor/guzzlehttp/psr7/src/MessageTrait.php(198): array_map(Object(Closure), Array)
#2 /var/www/html/lvmh/vendor/guzzlehttp/psr7/src/MessageTrait.php(170): GuzzleHttp\\Psr7\\Request->trimHeaderValues(Array)
#3 /var/www/html/lvmh/vendor/guzzlehttp/psr7/src/MessageTrait.php(148): GuzzleHttp\\Psr7\\Request->normalizeHeaderValue(Array)
#4 /var/www/html/lvmh/vendor/guzzlehttp/psr7/src/Request.php(47): GuzzleHttp\\Psr7\\Request->setHeaders(Array)
#5 /var/www/html/lvmh/Library/Connectors/MySGS.php(114): GuzzleHttp\\Psr7\\Request->__construct('PUT', Object(GuzzleHttp\\Psr7\\Uri), Array)
#6 /var/www/html/lvmh/Library/Connectors/MySGS.php(139): JST\\Library\\Connectors\\MySGS->send('/integrationsap...', 'PUT', Array)
#7 /var/www/html/lvmh/public/secure/test_m in /var/www/html/lvmh/vendor/guzzlehttp/psr7/src/MessageTrait.php on line 191
我似乎无法找到问题所在或如何解决问题的单一来源。事实上,几乎没有人遇到过这个问题,因为我看到的错误消息的唯一引用来自代码本身。
这是我正在拨打的电话的示例:
/**
* Wraps and sends a message with the correct authentication fields in place.
* @param $uri string The path to the resource we're accessing.
* @param $method string HTTP method
* @param $body mixed Any valid JSON-convertible type.
* @return bool pass/fail
*/
private function send(string $uri, string $method, $body): bool
{
if ($this->getTokenValid()) {
$options = [
'headers' => [
'Authorization' => sprintf("Bearer %s", $this->token),
'Ocp-Apim-Subscription-Key' => SUBSCRIPTION_ID,
'Content-Type' => 'application/json'
],
'body' => $body
];
$request = new Request($method, $uri, $options);
try {
$req = $this->client->send($request);
return $req->getReasonPhrase();
} catch (ClientErrorResponseException $e) {
error_log($e->getMessage());
return false;
}
} else {
error_log('Not authenticated');
return false;
}
}
根据我自己的研究,我发现 MessageTrait 类在尝试创建标头时会生成此错误消息。但是发生的事情没有多大意义。如果我发送一个空数组,我会收到一条错误消息(类的第 167 行)“'Header value can not be an empty array.'” 但是,当我传递一个字符串数组时,它会给我上面的错误消息。基于函数 normalizeHeaderValue(),即使我传入单个字符串,它也会将该值转换为数组,因此很明显,代码需要一个数组。
我很困惑。有人知道发生了什么吗?
解决方案
Guzzle 请求对象不接受 $options 参数。您正在创建一个 Request 实例:
$request = new Request($method, $uri, $options);
但它应该是:
$request = new Request($method, $uri, $headers, $body);
您得到的错误是由于 Guzzle 试图解析 $body ,就好像它是一个标题一样。因为它绝对不是一个标题(而是一个数组),所以它很难将它标准化,就好像它是一个标题一样。
推荐阅读
- go - 给定两个绝对URI,求它们之间的相对路径
- karate - 如何使用空手道 API 解析以下 JSON 响应
- google-bigquery - BigQuery 等效于“CREATE TABLE my_table (LIKE your_table)”
- javascript - 隐藏的输入值,表单循环中的非唯一 ID
- php - Laravel 5.5 路由控制器 [页面未找到]
- r - 通过自相关法计算音高误差
- amazon-web-services - AWS:在 redshift 中自动查询
- java - Angular中http.post的参数传递调用java Web API
- phabricator - 如何使用 api 编辑 phabricator 存储库 URI
- wcf - WCF 错误参数日期等于“01/01/0001”