【问题标题】:Unable to receive JSON POST request in PHP无法在 PHP 中接收 JSON POST 请求
【发布时间】:2016-06-12 00:37:33
【问题描述】:

我正在将一个 JOSN 对象从 Java 传递给 PHP。我正在使用 jdk 1.8 ang WAMP 服务器。 下面是Java代码。

import java.io.IOException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.simple.JSONObject;

/**
 *
 * @author PReeeT Dash
 */
public class FromJava 
{
    public static void main(String[] args) throws IOException
    {
        JSONObject json = new JSONObject();
        json.put("someKey", "someValue");    

        CloseableHttpClient httpClient = HttpClientBuilder.create().build();

        try 
        {
            HttpPost request = new HttpPost("http://localhost/PGP/JSONReq/tophp.php");
            StringEntity params = new StringEntity(json.toString());
            request.addHeader("content-type", "application/json");
            request.setEntity(params);
            httpClient.execute(request);
        // handle response here...
        } catch (Exception ex) 
        {
            System.out.println("Error: Cannot Estabilish Connection");        
        } 
        finally 
        {
            httpClient.close();
        }
    }    
}

PHP 脚本:

$data = json_decode(file_get_contents("php://input"));
echo($data);

当我运行 PHP 文件时,它总是显示一个空页面。谁能帮我理解为什么它不起作用。

当我运行以下 PHP 代码时,它总是执行 else 条件。

if ($_SERVER['REQUEST_METHOD'] == 'POST')
    {
        $data = json_decode(file_get_contents("php://input"));
        echo($data);
    }
    else
    {
        echo "XXXXXX";
    } 

【问题讨论】:

  • 您是否使用调试器单步执行以确保填充所有变量?
  • @Ascalonian 我可以用 Java 打印 JSON 对象。我尝试连接到不正确的 URL 以检查程序是否有效。它产生了一个例外。这表明连接建立成功。如果收到 POST 请求,我还在 PHP 端进行了测试。接收 POST 请求失败。

标签: java php json post


【解决方案1】:

我认为这行不通。

PHP 脚本不像 WebService 那样“监听”。但是,在收到请求后,脚本会对其进行处理并尝试以 HTML 而非 Java 格式“打印”结果。

【讨论】:

  • 是的,我希望脚本在浏览器中接收、处理和打印结果。可以是 PHP 或 HTML。如果您能建议我任何更好的方法,那就太好了。
  • 直接,你不能。您可以将请求写入文本文件或数据库,然后从 PHP 中搜索。请注意,许多请求将是数据库中的许多文本文件或记录。 <?php $file = fopen("request.txt", "w"); fwrite($file, $data); fclose($file); ?> 在另一个文件中,<?php $file = fopen("request.txt", "r"); while(!feof($file)) { echo fgets($file). "<br />"; } fclose($file); ?>
  • 可以使用 JSON post 请求。请查看此帖子stackoverflow.com/questions/14983521/…
【解决方案2】:

获取您的 org.apache.http.client 实例接收的响应正文,例如发送到 System.out

CloseableHttpResponse response = httpClient.execute(request);
IOUtils.copy(response.getEntity().getContent(), System.out);

对于 IOUtils 使用 import org.apache.commons.io.IOUtils; 如果您使用的是 maven,则依赖项是

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.4</version>
</dependency>

你很可能会得到输出

Catchable fatal error<:  Object of class stdClass could not be converted to string

因为echo($data) 不起作用。 json_decode(...) 返回一个标准类。 试试

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    // json_decode(..., true) will return an array instead of a stdClass
    $data = json_decode(file_get_contents("php://input"), true);
    var_export($data);
}
else
{
    var_export($_SERVER['REQUEST_METHOD']);
}

改为。

【讨论】:

  • 如果我需要从 JSON 对象中提取数据并将其传递给 PHP 函数,我该怎么办?
  • 请一题一题。这不像 Stackoverflow 会因为您创建问题而向您收费....
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 2016-04-28
  • 2011-04-14
  • 2012-02-03
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多