将 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
,然后使用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
【讨论】:
通常最好解释一个解决方案,而不是仅仅发布一些匿名代码行。你可以阅读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 响应