这是我的代码:
public function store(Request $request)
{
try {
$request->merge(['subject' => 'Subject']);
$client = new Client(['base_uri' => 'http://crm.vulcan/api/v1/']);
$res = $client->request('POST','contactForm',[
'headers' => [
'Accept' => 'application/json'
]
]);
} catch (RequestException $e) {
return Redirect::route('contact.form')->withErrors($e->getResponse());
}
}
它不起作用,因为我无法弄清楚$e->getResponse()
应该如何工作。
如果我dd($e->getResponse())
,那么我明白了:
Response {#330 ▼
-reasonPhrase: "Unprocessable Entity"
-statusCode: 422
-headers: array:7 [▶]
-headerLines: array:7 [▶]
-protocol: "1.1"
-stream: Stream {#328 ▶}
}
reasonPhrase
和statusCode
正是我所期待的,所以没有问题。
但是,我真正想要的只是来自API的JSON对象,它说明了哪些字段没有验证。我知道对象就在那里,因为当我通过Postman发送POST时我可以看到它。而且,奇怪的是,如果我在完全相同的$e->getResponse
上做出回报,那么我也可以看到该对象:
{
"name": [
"The name field is required."
],
"nickname": [
"The nickname field is required."
],
"email": [
"The email field is required."
],
"subject": [
"A subject must be provided"
],
"body-text": [
"The body-text field is required."
]
}
这正是我需要传递给withrors()然后我就完成了,但我无法弄清楚如何做到这一点。
我有一种感觉,我误解了关于溪流的事情,但我已经读过关于PSR7和溪流的内容,我担心我不明白它的含义是什么或者它是怎么回事?&#39与此特定问题相关。
修改
稍微调整一下之后,我将catch
更新为以下内容:
$errors = json_decode($e->getResponse()->getBody()->getContents());
return Redirect::route('contact.form')->withErrors($errors);
这似乎有效,因为我以Laravel可以用于表单的格式获取错误的JSON对象。
答案 0 :(得分:2)
这应该可以处理HTTP代码而不会抛出异常:
public function store(Request $request)
{
$request->merge(['subject' => 'Subject']);
$client = new Guzzle([
'base_uri' => 'http://crm.vulcan/api/v1/'
]);
$res = $client->request('POST','contactForm',[
'http_errors'=>false,
'headers' => [
'Accept' => 'application/json'
]
]);
if ($res->getStatusCode() == 422) {
//then there should be some validation JSON here;
$errors = json_decode($res->getBody()->getContents());
}
return Redirect::route('contact.form')->withErrors($errors);
}
答案 1 :(得分:2)
我想,你需要从反应中获取身体内容。正如documentation所述,您可以使用$response->getBody()
方法获取响应正文,并将其转换为string
。
如果您想稍后解析对php数组的json响应,可以直接使用$response->json()
方法。
在您的情况下,代码应如下所示:
$body = (string) $e->getResponse()->getBody();
// or
$body = $e->getResponse()->json();
编辑:我不确定$e->getResponse()
是否返回相同的类实例,如文档中所述。如果以上代码不起作用,您应该能够从$res
对象获取响应正文。