【问题标题】:Converting HTTP POST from curl (PHP) to HttpURLConnection (Java)将 HTTP POST 从 curl (PHP) 转换为 HttpURLConnection (Java)
【发布时间】:2017-06-15 13:16:53
【问题描述】:

我尝试将以下 PHP 代码(取自 https://www.cryptocoincharts.info/tools/api)转换为 java

// define pairs
$post = array("pairs" => "ltc_usd,ppc_btc");

// fetch data
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://api.cryptocoincharts.info/tradingPairs");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$rawData = curl_exec($curl);
curl_close($curl);

// decode to array
$data = json_decode($rawData);

// show data
echo "<pre>";
foreach ($data as $row)
{
    echo "Price of ".$row->id.": ".$row->price."\n";
    echo "Trade this pair on ".$row->best_market."\n";
}
echo "</pre>";

Java 代码

    URL url = new URL("http://api.cryptocoincharts.info/tradingPairs");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();

    //  CURLOPT_POST
    con.setRequestMethod("POST");

    // CURLOPT_FOLLOWLOCATION
    con.setInstanceFollowRedirects(true);

    String postData = "ltc_usd,ppc_btc";
    con.setRequestProperty("Content-length", String.valueOf(postData.length()));

    con.setDoOutput(true);
    con.setDoInput(true);

    DataOutputStream output = new DataOutputStream(con.getOutputStream());
    output.writeBytes(postData);
    output.close();

    // "Post data send ... waiting for reply");
    int code = con.getResponseCode(); // 200 = HTTP_OK
    System.out.println("Response    (Code):" + code);
    System.out.println("Response (Message):" + con.getResponseMessage());

    // read the response
    DataInputStream input = new DataInputStream(con.getInputStream());
    int c;
    StringBuilder resultBuf = new StringBuilder();
    while ( (c = input.read()) != -1) {
        resultBuf.append((char) c);
    }
    input.close();
    System.out.println("resultBuf.toString() " + resultBuf.toString());

根据 API,将其转换为 java 后,我应该只获得 LTC 和 PPC 详细信息的详细信息。相反,我得到了一个包含所有交易对的奇怪 Json。

2 $post = array("pairs" => "ltc_usd,ppc_btc"); Posted the PHP code as I am not known the exact equivalent in Java

能否请您指出我从 PHP 到 Java 的转换是否正确?

【问题讨论】:

  • @Berger 在这种情况下,OP Java 代码是正确的。他有移植问题。

标签: java php web-services httpurlconnection web-deployment


【解决方案1】:

据我所知,这两种实现的主要区别与$post 变量有关。

在 PHP 实现中$post 是一个键/值数组,但在 Java 中我只看到值部分。

我建议把postData变量内容改成pairs=ltc_usd,ppc_btc

【讨论】:

  • 你就是那个男人。长时间坐在这个问题上。谢谢!
  • 我认为是一个有趣的问题
【解决方案2】:

你没有提到关键部分,只提到了价值。当我们从 PHP API 获取数据时,我们有一个关联数组。如果你想显示输出,你需要知道特定关联数组的键和值。 InputStream 和 OutputStream 应该在 try-resources 里面

【讨论】:

    【解决方案3】:

    您可以尝试 curl-to-java lib 将 curl php 代码转换为 java 代码 https://github.com/jeffreyning/curl-to-java 像这样的演示 public Object curl(String url, Object postData, String method) {

        CurlLib curl = CurlFactory.getInstance("default");
        ch = curl.curl_init();
        curl.curl_setopt(ch, CurlOption.CURLOPT_CONNECTTIMEOUT, 1000);
        curl.curl_setopt(ch, CurlOption.CURLOPT_TIMEOUT, 5000);
        curl.curl_setopt(ch, CurlOption.CURLOPT_SSL_VERIFYPEER, false);
        curl.curl_setopt(ch, CurlOption.CURLOPT_SSL_VERIFYHOST, false);
        String postDataStr = "key1=v1";
    
        curl.curl_setopt(ch, CurlOption.CURLOPT_CUSTOMREQUEST, "POST");
        curl.curl_setopt(ch, CurlOption.CURLOPT_POSTFIELDS, postDataStr);
        curl.curl_setopt(ch, CurlOption.CURLOPT_URL, "https://xxxx.com/yyy");
        Object html = curl.curl_exec(ch);
        Object httpCode = curl.curl_getinfo(ch, CurlInfo.CURLINFO_HTTP_CODE);
        if (httpCode != null && 200 == Integer.valueOf(httpCode.toString())) {
            return null;
        }
        return html;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 2017-04-27
      • 1970-01-01
      • 2017-02-13
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2013-06-09
      相关资源
      最近更新 更多