【问题标题】:Need translate from PHP to Java需要从 PHP 翻译成 Java
【发布时间】:2016-09-29 21:20:35
【问题描述】:

尝试使用 QwintryLogistics API,PHP 中的所有文档示例,我根本不了解 PHP,使用 Java 编码。在所需的文档中,请求如下所示:

<?php
    define('SITE_URL', 'logistics.qwintry.com');
    define('API_KEY', 'YOUR_API_KEY'); //don't forget to set your key!

    $url =  'http://'. SITE_URL .'/api/cost';


    $data = array ( 
        'params' => array(
            'weight' => 5, // in lb
            'delivery_pickup' => 'msk_1', // full list of pickup points can be retrieved from /api/locations-list
            'insurance' => true,
            'items_value' => 500, // declaration items total cost in USD
            'retail_pricing' => true // retail / wholesale pricing?
        ),
     );
    $data_string = http_build_query($data);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer '. API_KEY));
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS,  $data_string);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $response = curl_exec($ch);
    curl_close($ch);
    var_dump($response);

Java 中的编码方法:

@Override
public String getCost(double weight, String unitsW, String toPickUp, boolean insurance, double value) throws URISyntaxException, IOException, HttpException {
    String url = BASE_URL + "/api/cost/";
    CloseableHttpClient client = HttpClients.createDefault();
    URIBuilder builder = new URIBuilder(url);
    builder
            .addParameter("weight", String.valueOf(weight))
            .addParameter("delivery_pickup", toPickUp)
            .addParameter("insurance", String.valueOf(insurance))
            .addParameter("items_value", String.valueOf(value))
            .addParameter("retail_pricing", String.valueOf(RETAIL_PRICING));

    HttpUriRequest request = new HttpPost(builder.build());
    request.addHeader("User-Agent", USER_AGENT);
    request.addHeader("Authorization", "Bearer " + API_KEY);

    HttpResponse response = client.execute(request);

    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

    StringBuffer result = new StringBuffer();
    String line = "";
    while ((line = rd.readLine()) != null) {
        result.append(line);
    }
    return result.toString();
}

但不断得到回应:

{"success":false,"errorCode":0,"errorMessage":"params are empty"}

我认为问题在于设置请求的参数。请帮我用Java术语翻译请求参数的结构。

【问题讨论】:

    标签: java php apache httpclient apache-httpclient-4.x


    【解决方案1】:

    您的 PHP 代码数据参数不是路径参数,而是请求参数。您必须将它们写入请求正文,而不是将它们附加到 URL。

    您可以在相关问题中看到如何做到这一点:Java - sending HTTP parameters via POST method easily

    但是,我会查看更高级别的 REST 服务客户端,例如 CXFJersey

    【讨论】:

    • 谢谢,开始使用 Unirest 库,看起来轻巧清晰,但还是没有成功...
    • 请求正文的结构对我来说不清楚,因为我根本不懂 PHP。如何使用 String 作为计数器制作参数数组? (params[weight], params[items_value],...等)
    • 终于成功了! API 文档中存在错误,某些参数名称错误。现在一切正常!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2019-03-29
    • 2021-07-07
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多