PHP 接收 JSON POST 数据

标签 php json api

我正在尝试从外部系统接收 JSON 数据,然后处理并保存到我的本地数据库。当事件触发时,外部系统将以下数据发送到我的系统。

外部系统日志显示:

Log 1:   Date/Time: 16 August 2017 11:54:44 AM
Status: Failure
Server: Apache https://blahblah.com/abc/data.php
Status Code:    OK
Event Content:  [{"field":"_USERNAME","value":""},
{"field":"_PASSWORD","value":""},
{"field":"_TOKEN","value":""},
{"field":"_CODE","value":"L77H4XD6ZA"},
{"field":"_SUBMITTEDDATE","value":"2017.08.16.01.54"},
{"field":"_SUBMITTEDDATEEXT","value":"2017.08.16.01.54.39.610"},
{"field":"_EDITEDDATE","value":"2017.08.16.01.55"},
{"field":"_SEQUENTIALID","value":"39a1cad9-2582-e711-9477-06c7814985cc"},
{"field":"_COMPLETETYPE","value":"Complete"},
{"field":"_LANGUAGE","value":"en"},
{"field":"_TOTALTIME","value":"12.59"},{"field":"_LINKURL","value":"http%3a%2f%2fsurv.blah.com%2ftest3%3fusr%3dL77H4XD6ZA"},
{"field":"GENDER","value":"TEXT%3aFemale%3bVALUE%3a2"},
{"field":"AGE","value":"TEXT%3a40%2b-%2b44%3bVALUE%3a6"},
{"field":"STATE","value":"TEXT%3aVIC%3bVALUE%3a2"},
{"field":"END_CHC","value":"TEXT%3aComplete%3bVALUE%3a2"},
{"field":"D2H","value":""},
{"field":"D2V","value":""},
{"field":"PCODE","value":""},
{"field":"PSTATE","value":""},
{"field":"PREGION","value":""},
{"field":"STATEREGION","value":""},
{"field":"TEST1","value":""}]

所以,在我的 php 文件 ( https://blahblah.com/abc/data.php ) 中有

$json = file_get_contents('php://input');
$obj = json_decode($json);

我一直在尝试使用 foreach() 循环来尝试获取每个字段和值,然后将其放入数据库中,例如

foreach($obj as $key => $value)
{
    $qry = $conn->prepare('INSERT INTO `key_value`(`db_id`, `rkey`, `rvalue`) VALUES (NULL,$key,$value)');
    $qry->execute();
}

但它不工作,我要么得到关于 foreach 循环的错误,要么如果我只是玩 echo 或 var_dumping,当我使用 Postman 或 ARC Chrome API 测试应用程序时,我在响应中得到 NULL。

所以,我怀疑我在如何做到这一点上完全走错了路。

任何人都可以帮助引导我回来吗?

编辑:我看过Receive JSON POST with PHP和其他一些人,但工作答案尚不清楚。

最佳答案

这里有几个问题。首先,您需要将 true 作为第二个参数传递给 json_decode为了获得关联数组而不是 stdClass。然后,当您迭代结果时,您不需要 $key,$value 是结果数组中的每个条目(每个“行”)。尝试运行它以查看发生了什么:

<?php
$json = <<<JSON
[{"field":"_USERNAME","value":""},
{"field":"_PASSWORD","value":""},
{"field":"_TOKEN","value":""},
{"field":"_CODE","value":"L77H4XD6ZA"},
{"field":"_SUBMITTEDDATE","value":"2017.08.16.01.54"},
{"field":"_SUBMITTEDDATEEXT","value":"2017.08.16.01.54.39.610"},
{"field":"_EDITEDDATE","value":"2017.08.16.01.55"},
{"field":"_SEQUENTIALID","value":"39a1cad9-2582-e711-9477-06c7814985cc"},
{"field":"_COMPLETETYPE","value":"Complete"},
{"field":"_LANGUAGE","value":"en"},
{"field":"_TOTALTIME","value":"12.59"},{"field":"_LINKURL","value":"http%3a%2f%2fsurv.blah.com%2ftest3%3fusr%3dL77H4XD6ZA"},
{"field":"GENDER","value":"TEXT%3aFemale%3bVALUE%3a2"},
{"field":"AGE","value":"TEXT%3a40%2b-%2b44%3bVALUE%3a6"},
{"field":"STATE","value":"TEXT%3aVIC%3bVALUE%3a2"},
{"field":"END_CHC","value":"TEXT%3aComplete%3bVALUE%3a2"},
{"field":"D2H","value":""},
{"field":"D2V","value":""},
{"field":"PCODE","value":""},
{"field":"PSTATE","value":""},
{"field":"PREGION","value":""},
{"field":"STATEREGION","value":""},
{"field":"TEST1","value":""}]
JSON;

$obj = json_decode($json, true);

foreach($obj as $currTuple)
{
    echo $currTuple['field'].':'.urldecode($currTuple['value'])."\n";
}

还有一些结果是 url 编码的,因此您可能希望在保存之前对其进行解码。

关于PHP 接收 JSON POST 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45704358/

相关文章:

php - 展开文本,但将每个数组片段作为三个单词返回

php - 如何使用php pdo安全地将数据插入mysql

javascript - 我无法设法将此 JSON 数据放入 DataTables 中

c# - 使用 C# 从 facebook 获取 FB 页面数据

api - Elasticsearch:聚合嵌套对象

python - 从 API 调用返回的 XML 中分配变量

javascript - 为什么通过php发送html时 'onclick'不起作用?

php - 访问另一页面后保留浏览器滚动位置

javascript - 动态加载 json 文件 - javascript

javascript - 正确地迭代 Angular 中的键值对