使用PHP阅读JSON POST

Ste*_*ews 57 php post json

在发布这个问题之前我环顾了很多,所以我很抱歉,如果是在另一个帖子上,这只是我在这里的第二个问题,如果我没有正确地格式化这个问题,那么道歉.

我有一个非常简单的Web服务,我创建了它需要获取post值并返回一个JSON编码的数组.一切正常,直到我被告知我需要发布带有内容类型的application/json的表单数据.从那时起,我无法从Web服务返回任何值,这肯定与我如何过滤他们的帖子值有关.

基本上在我的本地设置中,我创建了一个测试页面,它执行以下操作 -

$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);
Run Code Online (Sandbox Code Playgroud)

在网络服务上我有这个(我已经删除了一些功能) -

<?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);

?>
Run Code Online (Sandbox Code Playgroud)

基本上我知道这是由于没有设置$ _POST值但我找不到我需要放的东西而不是$ _POST.我尝试了json_decode($ _ POST),file_get_contents("php:// input")和其他一些方法,但我在黑暗中拍摄了一下.

任何帮助将不胜感激.

谢谢,史蒂夫

感谢迈克尔的帮助,这是向前迈出的一步,我现在至少得到一个回复​​,当我回应帖子....即使它是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));
Run Code Online (Sandbox Code Playgroud)

更新了数据发布到的页面上的php -

$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE ); //convert JSON into array

print_r(json_encode($input));
Run Code Online (Sandbox Code Playgroud)

正如我所说的那样,至少我在回复空白页面之前看到了回应

Mic*_*bov 123

你有空$_POST.如果您的Web服务器想要以json格式查看数据,则需要读取原始输入,然后使用JSON解码对其进行解析.

你需要这样的东西:

$json = file_get_contents('php://input');
$obj = json_decode($json);
Run Code Online (Sandbox Code Playgroud)

你也有错误的代码来测试JSON通信......

CURLOPT_POSTFIELDS告诉curl您将参数编码为application/x-www-form-urlencoded.你需要JSON-string.

UPDATE

您的测试页面的PHP代码应该是这样的:

$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);
Run Code Online (Sandbox Code Playgroud)

同样在您的Web服务页面上,您应该删除其中一行header('Content-type: application/json');.它必须只被调用一次.