这应该很简单,但我花了几个小时寻找答案,我真的被困住了。我正在构建一个基本的Laravel应用程序,并使用Guzzle来替换我目前正在制作的CURL请求。所有CURL函数都使用正文中的原始JSON变量。
我正在尝试创建一个正常工作的Guzzle客户端,但服务器正在使用'无效请求'我只是想知道我发布的JSON是否有些可疑。我开始怀疑你是否不能在Guzzle POST请求体中使用原始JSON?我知道标头正在工作,因为我从服务器收到有效的响应,我知道JSON是有效的,因为它当前在CURL请求中工作。所以我被困住了: - (
任何帮助都会非常感激。
$headers = array(
'NETOAPI_KEY' => env('NETO_API_KEY'),
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'NETOAPI_ACTION' => 'GetOrder'
);
// JSON Data for API post
$GetOrder = '{
"Filter": {
"OrderID": "N10139",
"OutputSelector": [
"OrderStatus"
]
}
}';
$client = new client();
$res = $client->post(env('NETO_API_URL'), [ 'headers' => $headers ], [ 'body' => $GetOrder ]);
return $res->getBody();
答案 0 :(得分:19)
您可以通过'json'
request option将常规数组作为JSON发送;这也会自动设置正确的标题:
$headers = [
'NETOAPI_KEY' => env('NETO_API_KEY'),
'Accept' => 'application/json',
'NETOAPI_ACTION' => 'GetOrder'
];
$GetOrder = [
'Filter' => [
'OrderID' => 'N10139',
'OutputSelector' => ['OrderStatus'],
],
];
$client = new client();
$res = $client->post(env('NETO_API_URL'), [
'headers' => $headers,
'json' => $GetOrder,
]);
答案 1 :(得分:0)
您可能需要设置body mime类型。这可以使用setBody()方法轻松完成。
$request = $client->post(env('NETO_API_URL'), ['headers' => $headers]);
$request->setBody($GetOrder, 'application/json');
答案 2 :(得分:0)
在这里开枪7
以下内容适用于我使用原始json输入
$data = array(
'customer' => '89090',
'username' => 'app',
'password' => 'pwd'
);
$url = "http://someendpoint/API/Login";
$client = new \GuzzleHttp\Client();
$response = $client->post($url, [
'headers' => ['Content-Type' => 'application/json', 'Accept' => 'application/json'],
'body' => json_encode($data)
]);
print_r(json_decode($response->getBody(), true));
由于某些原因,直到我在响应上使用json_decode,输出才被格式化。