Laravel4 JSON输入问题

时间:2013-12-04 13:07:40

标签: php json laravel laravel-4

我在这件事上遇到了很多问题。假设POST(我使用KnockoutJS将我的对象转换为json),我在http表单数据中发布。

$.post('uri', {data: ko.toJSON(data)}, function(response){
      // Handle response
    }, 'json');

这就是我的控制器内发生的事情

<?php
// 1. My plain input is here, and it's a slash-encoded string, 
// like { foo: \"bar\"}
$input = \Input::get('data');

// 2. Input::json() is empty, maybe because jquery 
// posts in the http form data instead of posting in payload.
$input = \Input::json();

因此,要从输入中获取数据,我必须

$input = stripcslashes($input);
dd(json_decode($input));

假设$ .post()调用无法更改,我只想接近此服务器端。

我认为L4应该提供解析的输入,我想我不应该做任何striplashes。那么,我做错了什么?

==编辑==

感谢fideloper的回答和评论,我会改变一些东西,因为客户端$ .post实际上有问题(无论如何,这不是这个问题的重点)。所以,这是新的javascript的样子(数据仍然被发布为application/x-www-form-urlencoded):

$.post('uri', ko.toJSON(data), function(response){
      // Handle response
    }, 'json');

现在服务器端发生了什么?

dd(\Input::all()); // < --- Contains nothing (array())

dd(\Input::json->all()); // < --- Contains data array, as expected

令我困惑的是这篇文档来自L4 Requests&Input

  

注意:某些JavaScript库(如Backbone)可能会向其发送输入   应用程序作为JSON。您可以通过Input :: get like访问此数据   正常。

在这种情况下,我可以通过Input :: get访问数据。再说一次:怎么了?

2 个答案:

答案 0 :(得分:1)

解决方案(我认为:D):

使用:

$input = json_decode( \Input::get('data') );

而不是:

$input = \Input::json();

说明:

Input::json()方法试图获取请求的正文,并假设它采用JSON编码格式。

但是,ajax调用不是将编码的JSON作为 body 发送,而是发送POST参数(不仅仅是JSON编码的字符串)。

因此,您需要获取正确的POST请求参数(在您的情况下为“data”)并对其进行解码,因为只有“data”POST参数实际上是JSON编码的字符串。

编辑:

我甚至不确定上述内容是否有效。由于jquery被告知“类型”是json,它实际上可能发送一个json编码的主体。这可能意味着相关数据被编码两次 - 一次调用toJson()时,以及jQuery编码数据对象时再次编码。

需要进行一些调查。

答案 1 :(得分:0)

由于你发送了如下所示的数组,这应该可行:

$_POST = array("data" => array("foo" => "bar")); 

$input =  Input::get('data');
$input = $input["data]"; 

如果你想避免这种情况,请使用以下javascript,可能会重新检查http://api.jquery.com/jQuery.post/(例1:$ .post(“test.php”,{name:“John”,time:“2pm”}) ;): 我不确定toJson Part,也许这甚至可以在没有toJson的情况下工作。

$.post('uri', ko.toJSON(data), function(response){
      // Handle response
    }, 'json');