向Codeigniter控制器发送JSON

18

我正在尝试使用Codeigniter接收和解析通过POST请求发送的JSON对象,但是我无法“找到”它。

这是我的控制器代码:

public function parse () {

  $json = $this->input->post();
  $json = stripslashes($json);
  $json = json_decode($json);

  print_r($json);

}

这是我的JSON对象:

{"data":"value"}
12个回答

30

这是正确的做法。

$input_data = json_decode(trim(file_get_contents('php://input')), true);

php://input 只能被读取一次,在这个时候 CodeIgniter input 类已经读取了它。 - Chris Cox
只需在请求头中添加正确的内容类型,'Content-Type: application/json'。正如Chris所提到的,Codeigniter会在调用您的方法之前读取输入。 - Shailesh
2
无论你们评论什么,它们与我发布这个答案的日期没有关系,而那时我的答案是正确的。 - CMCDragonkai

12
$post = json_decode($this->security->xss_clean($this->input->raw_input_stream));

当您使用$this->input->raw_input_stream时,您可以多次读取它,它基本上与file_get_contents('php://input')相同。这适用于CI3。我不知道它是否适用于CI2。


9

尝试运行此代码,它将输出一个包含所有参数的数组。

$this->input->raw_input_stream;

$input_data = json_decode($this->input->raw_input_stream, true);

$input_data将返回一个数组


2
Firze的答案是正确的,但这里有一个更详细的答案。我不能评论,所以我把它作为一个答案发布。
这与CodeIgniter无法获取JSON有关。jQuery在幕后进行一些技巧,并将您的数据转换为form-data-x,这就是为什么当您不指定内容类型、不对对象进行编码或其他情况时它能够工作的原因。
如果你想要一个纯JSON的解决方案,就可以使用$this->input->raw_input_stream来获取你的JSON,并使用php的json_decode解码它。查看下面的完整答案和代码: 在CodeIgniter中检索JSON POST数据

2
尝试使用这个替代方案。
$json = $this->input->post('data');
$json = stripslashes($json);
$json = json_decode($json);
print_r($json);

您需要将您想要从post数组中获取的数据变量的关键字作为参数传递给post()函数。

这个可以:data={"color":"blue"}但是这样可以吗?如果有一个库能“转换”它们,那就很棒了,这样我就可以使用Codeigniter验证。 - Jonathan Clark

1
controller:
puplic function exam(){
$obj = file_get_contents('php://input');
$edata = json_decode($obj);
echo $edata->name;
}
Go to post man->type->post
url:http://www.exam.com/exam
formate:json
{
"name":"atm fahim"
}
==>send

2
通常最好解释一下解决方案,而不仅仅是发布一些匿名代码行。您可以阅读《如何撰写良好的答案》和《解释完全基于代码的答案》。 - Anh Pham

0

只需在请求头中添加正确的内容类型即可。

Content-Type: application/json

0
为了使用标准的CI方法。 在index.php中,插入几行代码:
    $json = json_decode(trim(file_get_contents('php://input')), true);
    if(!empty($json)) {
        $_POST = $json;
    }

要么在Bootstrap中实现。 RIP Codigniter...(


0

确保您有POST数据,使用$this->input->post()将始终返回空值,您应该在输入类型名称上放置$this->input->post('name_of_input_text')


0
你确定你正在使用POST方法发送数据而不是GET方法吗?我今天早些时候遇到了这个问题(这也是我找到这个问题的原因),当时我正在使用POST方法,但是使用了JSONP,而JSONP似乎是使用GET方法完成的。
CodeIgniter有一个名为get_post的函数,可以从任何地方获取数据。
$this->input->get_post_string('data'); 

希望这能对你有所帮助。
如果你愿意,你也可以手动完成它。
function get_post($index = '', $xss_clean = FALSE){
    if ( ! isset($_POST[$index]) )
    {
        return $this->get($index, $xss_clean);
    }
    else
    {
        return $this->post($index, $xss_clean);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接