使用 PHP 读取 JSON POST [英] Reading JSON POST using PHP
问题描述
在发布这个问题之前我环顾了很多,所以如果它在另一个帖子上,我很抱歉,这只是我在这里的第二个问题,如果我没有正确格式化这个问题,我很抱歉.
I looked around a lot before posting this question so my apologies if it is on another post and this is only my second quesiton on here so apologies if I don't format this question correctly.
我创建了一个非常简单的 Web 服务,它需要获取 post 值并返回一个 JSON 编码的数组.一切都很好,直到我被告知我需要发布内容类型为 application/json 的表单数据.从那以后,我无法从 Web 服务返回任何值,这肯定与我过滤帖子值的方式有关.
I have a really simple web service that I have created that needs to take post values and return a JSON encoded array. That all worked fine until I was told I would need to post the form data with a content-type of application/json. Since then I cannot return any values from the web service and it is definitely something to do with how I am filtering their post values.
基本上在我的本地设置中,我创建了一个执行以下操作的测试页面 -
Basically in my local setup I have created a test page that does the following -
$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data))
);
curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/'); // Set the url path we want to call
$result = curl_exec($curl);
//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);
在webservice上我有这个(我去掉了一些功能)-
On the webservice I have this (I have stripped out some of the functions) -
<?php
header('Content-type: application/json');
/* connect to the db */
$link = mysql_connect('localhost','root','root') or die('Cannot connect to the DB');
mysql_select_db('webservice',$link) or die('Cannot select the DB');
if(isset($_POST['action']) && $_POST['action'] == 'login') {
$statusCode = array('statusCode'=>1, 'statusDescription'=>'Login Process - Fail');
$posts[] = array('status'=>$statusCode);
header('Content-type: application/json');
echo json_encode($posts);
/* disconnect from the db */
}
@mysql_close($link);
?>
基本上我知道这是由于未设置 $_POST 值,但我找不到我需要放置的内容而不是 $_POST.我试过json_decode($_POST)、file_get_contents("php://input") 和许多其他方式,但我在黑暗中拍摄了一点.
Basically I know that it is due to the $_POST values not being set but I can't find what I need to put instead of the $_POST. I tried json_decode($_POST), file_get_contents("php://input") and a number of other ways but I was shooting in the dark a bit.
任何帮助将不胜感激.
谢谢,史蒂夫
感谢迈克尔的帮助,这是向前迈出的明确一步,我现在至少在回复帖子时得到了回复......即使它是空的
Thanks Michael for the help, that was a definite step forward I now have at least got a repsonse when I echo the post....even if it is null
更新的 CURL -
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
在发布数据的页面上更新了 php -
updated php on the page that the data is posted to -
$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE ); //convert JSON into array
print_r(json_encode($input));
正如我所说的,至少我现在看到了一个响应,而之前它返回的是一个空白页面
As I say at least I see a response now wheras prior it was returning a blank page
推荐答案
您的 $_POST
为空.如果您的网络服务器想要查看 json 格式的数据,您需要读取原始输入,然后使用 JSON 解码对其进行解析.
You have empty $_POST
. If your web-server wants see data in json-format you need to read the raw input and then parse it with JSON decode.
你需要这样的东西:
$json = file_get_contents('php://input');
$obj = json_decode($json);
您还有用于测试 JSON 通信的错误代码...
Also you have wrong code for testing JSON-communication...
CURLOPT_POSTFIELDS
告诉 curl
将您的参数编码为 application/x-www-form-urlencoded
.此处需要 JSON 字符串.
CURLOPT_POSTFIELDS
tells curl
to encode your parameters as application/x-www-form-urlencoded
. You need JSON-string here.
更新
你的测试页面的php代码应该是这样的:
Your php code for test page should be like that:
$data_string = json_encode($data);
$ch = curl_init('http://webservice.local/');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
$result = json_decode($result);
var_dump($result);
同样在您的网络服务页面上,您应该删除 header('Content-type: application/json');
行之一.它只能被调用一次.
Also on your web-service page you should remove one of the lines header('Content-type: application/json');
. It must be called only once.
这篇关于使用 PHP 读取 JSON POST的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!