处理 JSON 格式的 POST 请求

Posted

技术标签:

【中文标题】处理 JSON 格式的 POST 请求【英文标题】:Handle POST request in JSON format 【发布时间】:2016-11-15 08:17:32 【问题描述】:

我正在尝试处理来自网络服务的 POST 请求。它正在发送这样的 HTTP POST 请求:


"latitude":"12.232",
"longitude":"123.323"

它发布到我服务器上的 php 文件。我知道它肯定会击中文件。但是,我没有得到数据。

在我的 PHP 中,我有这个(省略了一堆东西:

$json = file_get_contents('php://input');
$obj = json_decode($json);
$mine ="sixteen"; //using this for a test

$sql = "INSERT INTO rr_emergency (random) VALUES('$obj');";
$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);

这不会改变我的数据库。

如果我这样做:

$sql = "INSERT INTO rr_emergency (random) VALUES('$mine');";

然后,每次 web 服务调用我的 PHP 时,都会在我的表中新行的正确位置添加“十六”。这就是我知道我正在接收数据的方式。

注意:我试图简单地将 $obj 添加到我的表中,只是为了查看返回的数据格式,然后再尝试正确解析它并将所有内容放在它所属的位置。

我在这里做错了什么?我认为问题出在 ($json = file_get_contents('php://input');),但不知道还能尝试什么。

谢谢。

【问题讨论】:

您不能将 PHP 对象存储到 mysql 表列中。 $obj = json_decode($json); 的结果是 PHP 对象而不是字符串 在查询代码中添加一些错误检查,您可能会看到有用的错误消息。 你不能用$_POST['latitude'];得到值吗?我猜 JSON 不允许? @ntgCleaner 认为这可能有效,它确实成功地向数据库添加了一个新条目,但它完全是空的。 【参考方案1】:

所以有一些问题

$obj = json_decode($json);

这将返回一个object。你想要一个array

$obj = json_decode($json, true);

那么你的 PDO 不正确

$sql = "INSERT INTO rr_emergency (random) VALUES(:val);";
$prep = $dbh->prepare($sql);
foreach($obj as $row) $prep->execute([':val' => $row]);

这将正确插入您的数据(使用准备好的语句)并遍历 JSON 返回数据

【讨论】:

这完全把我带到了我需要去的地方。问题是这样的:$obj = json_decode($json, true);,然后我可以执行$first =$obj['latitude'];,然后使用该变量将正确的数据放入我的表中。循环不是必需的,但我可以根据我的问题看到你从哪里得到的。谢谢!【参考方案2】:

当你真的需要一个字符串时,你正试图插入一个对象。使用:

$obj = json_decode($json, true)
$obj_str = implode(", ", $obj);
$sql = "INSERT INTO rr_emergency (random) VALUES('$obj_str');";

在我发布以上内容后,您补充说:

我试图简单地将 $obj 添加到我的表中只是为了查看数据 格式

对象本身不会转换为字符串,因此将$obj 放在查询中是行不通的。我需要时将对象存储在数据库中的方式是直接存储 JSON 表示法。

$json = file_get_contents("php://input");
$sql = "INSERT INTO rr_emergency (random) VALUES('$json')";

您将失去在对象中执行过滤和选择操作的能力,但这是一种打包数据的有效方法,您不需要数据库解析。

如果您需要格式良好、易于阅读的结构:

$obj = json_decode($json);
$obj_str = print_r($obj,true); //store formatted string
$sql = "INSERT INTO rr_emergency (random) VALUES('$obj_str');";

如果如你所说,只需要“只看数据格式”,我建议回显到屏幕或写入日志文件;执行以下操作之一。打印到屏幕:

print_r($obj);

写入文件:

$filepath = "/path/to/file.txt"
file_put_contents($filepath,print_r($obj,true));

重要提示

直接在数据库查询中输入文本而不转义会使您容易受到 SQL 注入攻击。请改用准备好的语句。

【讨论】:

以上是关于处理 JSON 格式的 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何将请求参数转为json格式

初学flask

Springmvc处理post+json数据

requests: 发送一个json格式的post请求

C# POST请求 json格式

java发送POST请求请求数据为json格式