【问题标题】:Post JSON to Codeigniter controller将 JSON 发布到 Codeigniter 控制器
【发布时间】: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"}

【问题讨论】:

    标签: json codeigniter


    【解决方案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,然后使用php 的json_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
          

          【讨论】:

          【解决方案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() 数组始终为空。我不知道为什么。
                    猜你喜欢
                    • 2011-07-28
                    • 2016-05-28
                    • 2016-07-05
                    • 1970-01-01
                    • 2017-06-22
                    • 2012-10-03
                    • 2015-05-02
                    • 2015-08-02
                    • 2013-07-03
                    相关资源
                    最近更新 更多