接收简单 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.dev
向project.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' => 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的主要内容,如果未能解决你的问题,请参考以下文章
vue使用axios发送post请求携带json body参数,后端使用@RequestBody进行接收