6

我是 laravel 的新手,我正在尝试实现一个简单的 rest api。

我已经实现了控制器,并通过单元测试进行了测试。

我的问题是 POST 请求。

通过测试 Input:json 有数据,通过外部休息客户端它返回 null。

这是单元测试的代码

    $newMenu = array(
      'name'=>'Christmas Menu', 
      'description'=>'Christmas Menu',
      'img_url'=>'http://www.example.com',
      'type_id'=>1,
    );
    Request::setMethod('POST'); 
    Input::$json = $newMenu;
    $response = Controller::call('menu@index');

我究竟做错了什么?

更新:

这真的让我发疯

我已经实例化了一个新的 laravel 项目,并且只有以下代码:

路线

Route::get('test', 'home@index');
Route::post('test', 'home@index');

控制器:

class Home_Controller extends Base_Controller {

    public $restful = true;
    public function get_index()
    {
        return Response::json(['test'=>'hello world']);
    }
    public function post_index()
    {
        return Response::json(['test'=>Input::all()]);
    }
}

卷曲调用:

curl -H "Accept:application/json" -H"Content-type: application/json" -X POST -d '{"title":"world"}' http://localhost/laravel-post/public/test

回复:

{"test":[]}

谁能指出我出了什么问题。

这真的阻止了我使用 laravel,我真的很喜欢这个概念。

4

3 回答 3

8

因为您将 JSON 作为 HTTP 正文发布,所以您无法通过Input::all()获得它;你应该使用:

$postInput = file_get_contents('php://input');
$data = json_decode($postInput, true);

$response = array('test' => $data);
return Response::json($response);

你也可以使用

Route::any('test', 'home@index');

代替

Route::get('test', 'home@index');
Route::post('test', 'home@index');
于 2013-04-04T06:21:48.647 回答
3

如果使用:Route::post('test', 'XYZController@test');
发送数据格式:Content-type : application/json
例如:{"data":"foo bar"}

您可以通过以下方式获取帖子(任何其他:get、put...等)数据:

Input::get('data');

这清楚地写在这里: http: //laravel.com/docs/requests 。正确Content-type很重要!

我不确定您的 CURL 调用是否正确。也许这会有所帮助:How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?

我正在使用Input::get('data')并且它有效。

于 2013-12-13T00:11:01.723 回答
3

删除标头Content-type: application/json如果您将其作为键值对而不是 json 发送

于 2016-09-06T06:54:38.177 回答