将 JSON 发布到 Codeigniter 控制器

Posted

技术标签:

【中文标题】将 JSON 发布到 Codeigniter 控制器【英文标题】:Post JSON to Codeigniter controller 【发布时间】:2012-01-25 15:25:09 【问题描述】:

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

这是我的控制器代码:

public function parse () 

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

  print_r($json);


这是我的 JSON 对象:

"data":"value"

【问题讨论】:

【参考方案1】:

这是正确的做法。

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

【讨论】:

php://input 只能读取一次,此时 CodeIgniter 输入类已经读取过了。 只需将正确的内容类型添加到您的请求标头,'Content-Type: application/json'。正如 Chris 所说,Codeigniter 在您的方法被调用之前读取输入。 无论你们发表什么评论,它们与我发布此答案的日期无关,这在我发布的日期是正确的。【参考方案2】:
$post = json_decode($this->security->xss_clean($this->input->raw_input_stream));

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

【讨论】:

【参考方案3】:

试试这段代码,它会输出一个包含所有参数的数组。

$this->input->raw_input_stream;

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

$input_data 将返回数组

【讨论】:

【参考方案4】:

试试这个

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

您需要将您想要的数据变量的键从 post 数组作为参数传递给post()

【讨论】:

这行得通:data="color":"blue" 但可以吗?使用可以“转换”它们以便我可以使用 Codeigniter 验证的库会很酷。【参考方案5】:

Firze 的答案是正确的,但这里有一个更详细的答案。我不允许发表评论,所以我将其发布为答案。

这与 CodeIgniter 无法获取 JSON 有关。 jQuery 做了一些幕后技巧并将您的数据转换为 form-data-x,这就是为什么当您不指定 content type、不编码您的对象或其他情况时它可以工作。

如果你想要一个纯粹的JSON,解决方案是使用$this->input->raw_input_stream 来获取你的JSON,然后使用phpjson_decode 对其进行解码。检查下面的完整答案和代码:

Retrieve JSON POST data in CodeIgniter

【讨论】:

【参考方案6】:
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

【讨论】:

通常最好解释一个解决方案,而不是仅仅发布一些匿名代码行。你可以阅读How do I write a good answer,也可以阅读Explaining entirely code-based answers【参考方案7】:

确保你有POST数据,使用$this->input->post()它总是返回空,你应该输入输入类型名称$this->input->post('name_of_input_text')

【讨论】:

【参考方案8】:

您确定要发布数据而不是执行 GET 吗?我今天早些时候遇到了这个问题(这就是我发现这个问题的方式),我正在做一个 POST 但使用 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);
    

【讨论】:

【参考方案9】:

我知道这是一篇旧帖子,但对于其他人来说,这可能会有所帮助:

在浏览器端,我使用类似于此模式的代码创建数据包:

    var form_data =  ;
    $.each($('#mvt_dialog_form').serializeArray(), function() 
        form_data[this.name] = this.value;
    ); 

   // add the address data to the payload
   var result =  
        form_data: form_data,
        locations: addressData,
        selected_location:  selectedLocation
    ;

   // now wrap it all up with a pretty bow
   // Seriously, the key:value format is required for codeigniter INPUT class to be able to "see"
   var movement = 
       movement_dlg: JSON.stringify(result)
   ;

然后我将动作“发布”到服务器。 在控制器中,我然后使用以下逻辑:

    // Perform XSS filtering
    $postData = $this->input->post(NULL, TRUE);
    $result = json_decode($postData['movement_dlg']);

【讨论】:

【参考方案10】:

只需将正确的内容类型添加到您的请求标头

Content-Type: application/json

【讨论】:

【参考方案11】:

为了使用标准的 CI 方法。 在 index.php 中,插入几行:

    $json = json_decode(trim(file_get_contents('php://input')), true);
    if(!empty($json)) 
        $_POST = $json;
    

在引导程序中实现。 RIP 编码器...(

【讨论】:

【参考方案12】:

试试

json_decode(array($this->input->post()))

$tmp[] = (array)json_decode($this->input->post());

print_r($tmp);

【讨论】:

$this->input->post() 数组始终为空。我不知道为什么。

以上是关于将 JSON 发布到 Codeigniter 控制器的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter - 使用 json 将单个查询结果传递给控制器​​ - 如果存在

Codeigniter - 如何将 JSON 作为参数传递给视图 [重复]

CodeIgniter - 如何从控制器返回 Json 响应

如何在 CodeIgniter 控制器中读取 JSON 文件

CodeIgniter 控制器 - JSON - AJAX

表单需要将数据发布到 codeigniter 中的控制器