接收简单 JSON 请求时 RequestException.php 中的 Laravel ServerException

Posted

技术标签:

【中文标题】接收简单 JSON 请求时 RequestException.php 中的 Laravel ServerException【英文标题】:Laravel ServerException in RequestException.php when receiving simple JSON request 【发布时间】:2016-09-04 01:56:12 【问题描述】:

我正在使用 Laravel 5 框架与制造商进行通信,并且在接收回调时遇到困难:

这里是路线(设置它们,只是为了测试):

Route::post('/callback', 'PrintController@callback');
Route::get('/callback', 'PrintController@callback');

以及控制器中的简单方法:

public function callback(Request $request)

    var_dump( $request );
    //Storage::put('request.txt', $request);

如果我手动打开站点(意思是,它转储请求并稍后创建请求文件),它工作正常,但是当像这样调用时:

/**
 * Test callback option
 */
public function testCallback()

    $callback_url = 'http://project.dev/callback';

    // Prepare response
    $response = array(
        'time' => -microtime(true),
    );

    $data = [
        "id" => 907,
        "current_state" => "Shipped",
        "merchant_sku" => "BST123",
        "ordered_on_date" => "2015-08-16T00:00:00+0200",
        "ship_by_date" => "2015-08-21T00:00:00+0200",
        "shipping_carrier" => "USPS",
        "shipping_tracking" => "9499907123456123456781",
    ];

    try 
        $result = Guzzle::post($callback_url, [
            'verify' => false,
            'headers' => [
                'Content-Type' => 'application/json',
            ],
            'json' => $data,
        ]);
        $body = json_decode($result->getBody(), true);

        // Fill response
        if ($body['success'] == true) 
            $response['success'] = true;
            $response['order_id'] = $body['work_order_id'];
         else 
            $response['success'] = false;
        
     catch (Exception $e) 
        // Set error
        $response['success'] = false;
        $response['message'] = $e->getMessage();
    

    // Save execution time
    $response['time'] += microtime(true);
    $response['time'] = round(abs($response['time']), 4);

    return $response;

我收到此错误消息:

ServerException in RequestException.php line 107:
Server error: `POST http://project.dev/callback` resulted in a `500 Internal Server Error` response:
<!DOCTYPE html>
<html>
<head>
<meta name="robots" content="noindex,nofollow" />
<style>
(truncated...)

编辑: 我在php_error.log 中收到的唯一类似错误的消息是:

[09-May-2016 12:24:20 UTC] PHP Deprecated:  Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0

任何想法我做错了什么和/或如何调试和解决这个问题?

顺便说一句:通信发生在save机器中的两个laravel框架之间,意思是site.devproject.dev发送请求。

编辑:在收到 POST 时在 laravel 错误日志中发现了这个。它适用于 GET 查找。

[2016-05-09 15:21:25] local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in D:\project.dev\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php:67

既然我用 'verify' =&gt; false 发送请求,为什么 Laravel 还要关心这个?

【问题讨论】:

您可以使用邮递员重现错误吗?将 env 设置为 local 并将 debug 设置为 true ,laravel 很可能会告诉你出了什么问题。 @FrankProvost 抱歉回复晚了。我已经调试过了,我看不到任何导致正确错误的东西,但是当我发送一个获取请求时它工作正常。 【参考方案1】:

我解决了。我将路由 移到了 中间件之外,因此不需要令牌验证:

Route::post('/callback', 'PrintController@callback');
Route::get('/callback', 'PrintController@callback');

Route::group(['middleware' => ['web']], function () 
    ...

以防万一其他人遇到同样的问题:此处不需要中间件,因为制造商不使用相同的会话并且无法提供所需的令牌。

【讨论】:

以上是关于接收简单 JSON 请求时 RequestException.php 中的 Laravel ServerException的主要内容,如果未能解决你的问题,请参考以下文章

postman发送json数据 ,服务端接收json数据

vue使用axios发送post请求携带json body参数,后端使用@RequestBody进行接收

Struts2 Action接收POST请求JSON数据及其实现解析

c# mvc ajax 提交与 接收参数

ajax接收遍历处理json格式数据

json使用记录