使用Guzzle通过(POST)检索API,无法传递JSON参数进行查询
Using Guzzle to retrieve API via (POST), unable to pass JSON parameters for query
我创建了一个 API 请求,它可以正常连接到服务器并通过基本身份验证。我收到的错误是
"Uncaught GuzzleHttp\Exception\ClientException: Client error: POST http://my.api.com/dest/addr
resulted in a 400 Bad Request
response:
{"code":400,"result":"Missing customer id"
我尝试了很多方法来传递查询参数,其中 none 行得通。我检查以确保正在输出的 JSON 格式正确。我已按照 Guzzle 文档中的说明进行操作。我还尝试了在论坛中可以找到的所有解决方案,其中 none 给了我不同的回应。我不确定我错过了什么,希望有人能看到问题可能是什么......我已经粘贴了我认为最符合下面 Guzzle 文档的代码。谢谢。
<?php
require __DIR__.'/../vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
Use GuzzleHttp\Psr7;
try {
$client = new Client(['base_uri' => 'http://my.api.com/']);
$credentials = base64_encode('12345');
$request_param = [
'json' => [
'customer' => [
'name' => 'Mary',
'id' => 111
],
'products' => [
[
'product_id' => 2,
'qty' => 3
]
]
]
];
$request_data = json_encode($request_param, true);
$headers = ['headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Basic ' . $credentials
]];
$response = $client->request('POST', 'dest/addr', $headers, $request_data);
echo $response->getStatusCode();
echo "<br />";
echo $response->getHeader('content-type')[0];
echo "<br />";
echo "<pre />";
echo $response->getBody()->getContents();
}
catch(\GuzzleHttp\Exception\ClientException $e) {
echo $e->getCode(). '<hr />';
echo $e->getMessage();
}
//Server Exception
catch(\GuzzleHttp\Exception\ServerException $e) {
echo $e->getCode(). '<hr />';
echo $e->getMessage();
}
如果你的 my.api.com
可以接受 json
请求(不是形式参数 json=json_string&something=post 正文中的值)。你可以试试像这样
$json_data = [
'customer' => [
'name' => 'Mary',
'id' => 111
],
'products' => [
[
'product_id' => 2,
'qty' => 3
]
]
];
$headers = [
'Authorization' => 'Basic ' . $credentials
];
$response = $client->request('POST', 'dest/addr', [
'json' => $json_data,
'headers' => $headers
]);
您是否尝试过像使用 headers
请求选项一样使用 json
请求选项?文档显示了这样的示例:
An easy way to upload JSON data and set the appropriate header is using the json request option:
$r = $client->request('PUT', 'http://httpbin.org/put', [
'json' => ['foo' => 'bar']
]);
语法与 headers
选项非常相似。目前,您的代码正在尝试发送原始 json。 json
请求选项的文档位于 https://docs.guzzlephp.org/en/stable/quickstart.html#uploading-data
我创建了一个 API 请求,它可以正常连接到服务器并通过基本身份验证。我收到的错误是
"Uncaught GuzzleHttp\Exception\ClientException: Client error:
POST http://my.api.com/dest/addr
resulted in a400 Bad Request
response: {"code":400,"result":"Missing customer id"
我尝试了很多方法来传递查询参数,其中 none 行得通。我检查以确保正在输出的 JSON 格式正确。我已按照 Guzzle 文档中的说明进行操作。我还尝试了在论坛中可以找到的所有解决方案,其中 none 给了我不同的回应。我不确定我错过了什么,希望有人能看到问题可能是什么......我已经粘贴了我认为最符合下面 Guzzle 文档的代码。谢谢。
<?php
require __DIR__.'/../vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
Use GuzzleHttp\Psr7;
try {
$client = new Client(['base_uri' => 'http://my.api.com/']);
$credentials = base64_encode('12345');
$request_param = [
'json' => [
'customer' => [
'name' => 'Mary',
'id' => 111
],
'products' => [
[
'product_id' => 2,
'qty' => 3
]
]
]
];
$request_data = json_encode($request_param, true);
$headers = ['headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Basic ' . $credentials
]];
$response = $client->request('POST', 'dest/addr', $headers, $request_data);
echo $response->getStatusCode();
echo "<br />";
echo $response->getHeader('content-type')[0];
echo "<br />";
echo "<pre />";
echo $response->getBody()->getContents();
}
catch(\GuzzleHttp\Exception\ClientException $e) {
echo $e->getCode(). '<hr />';
echo $e->getMessage();
}
//Server Exception
catch(\GuzzleHttp\Exception\ServerException $e) {
echo $e->getCode(). '<hr />';
echo $e->getMessage();
}
如果你的 my.api.com
可以接受 json
请求(不是形式参数 json=json_string&something=post 正文中的值)。你可以试试像这样
$json_data = [
'customer' => [
'name' => 'Mary',
'id' => 111
],
'products' => [
[
'product_id' => 2,
'qty' => 3
]
]
];
$headers = [
'Authorization' => 'Basic ' . $credentials
];
$response = $client->request('POST', 'dest/addr', [
'json' => $json_data,
'headers' => $headers
]);
您是否尝试过像使用 headers
请求选项一样使用 json
请求选项?文档显示了这样的示例:
An easy way to upload JSON data and set the appropriate header is using the json request option:
$r = $client->request('PUT', 'http://httpbin.org/put', [
'json' => ['foo' => 'bar']
]);
语法与 headers
选项非常相似。目前,您的代码正在尝试发送原始 json。 json
请求选项的文档位于 https://docs.guzzlephp.org/en/stable/quickstart.html#uploading-data