使用Guzzle将错误从API Respose传递到Laravel视图

时间:2016-02-22 13:54:06

标签: laravel guzzle

这是我的代码:

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 ▶}
}

reasonPhrasestatusCode正是我所期待的,所以没有问题。

但是,我真正想要的只是来自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对象。

2 个答案:

答案 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对象获取响应正文。