java - Https 请求可与curl配合使用,但因HttpsURLConnection而失败

标签 java curl httpsurlconnection

我有一个如下所示的 curl 请求:-

curl -H "Accept: application/json" -H "Content-Type: application/json" -X POST -d '{"Request": {"Orders":[{"id_sales_order": 160407400833822,"address_billing": {"first_name":"John","last_name": "Doe","phone": "1234567","phone2": "1234","address1": "Sesamestreet 123","city": "Berlin","postcode": "12345","country": "Germany"}}]}}' "https://debraj:debrajmanna@example.com/oms-api/?Action=UpdateOrderInformation&ServiceName=OMS&Signature=e436d6c7c930fa37a30a8b67051cb4531dad92b0c904a5a009bb4529a762dcd7&Timestamp=2016-04-09T19%3A14%3A12%2B0530&Version=1.0"

这给出了输出:-

{"ErrorResponse":{"Head":{"RequestAction":"UpdateOrderInformation","ErrorType":"Sender","ErrorCode":0,"ErrorMessage":"Some elements were not processed"},"Body":{"UpdateOrderInformation":[{"ErrorCode":null,"ErrorMessage":"Order with source id: 160407400833822 was not found","Position":0}]}}}

为了在 Java 中实现这一点,我有以下 java 代码。但 java 代码的行为并不符合预期。有人可以让我知道我做错了什么吗?

public class CurlMain {

    public static void main(String[] args) throws Exception {
    String url = "https://example.com/oms-api/";
    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    con.setRequestMethod("POST");
    String authStr = String.format("%s:%s", "debraj", "debrajmanna");
    String body = "{'Request': {'Orders':[{'id_sales_order': 160407400833822,'address_billing': {'first_name':'John','last_name': 'Doe','phone': '1234567','phone2': '1234','address1': 'Sesamestreet 123','city': 'Berlin','postcode': '12345','country': 'Germany'}}]}}";
    String encodedAuthStr = Base64.getEncoder().encodeToString(authStr.getBytes(StandardCharsets.UTF_8));
    con.setRequestProperty("Authorization", "Basic " + encodedAuthStr);
    con.setRequestProperty("Content-Type", "application/json");
    con.setRequestProperty("Accept", "application/json");

    String urlParameters = "Action=UpdateOrderInformation&ServiceName=OMS&Signature=e436d6c7c930fa37a30a8b67051cb4531dad92b0c904a5a009bb4529a762dcd7&Timestamp=2016-04-09T19%3A14%3A12%2B0530&Version=1.0";

    // Send post request
    con.setDoOutput(true);
    DataOutputStream wr = new DataOutputStream(con.getOutputStream());
    wr.writeBytes(urlParameters);
    wr.writeBytes(body);
    wr.flush();
    wr.close();

    int responseCode = con.getResponseCode();
    HttpsURLConnection.setFollowRedirects(true);
    Map<String, List<String>> headers = con.getHeaderFields();
    System.out.println(headers.toString());

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();

    System.out.println("Curl Response " + response.toString());
    }

而java代码正在打印:-

{"ErrorResponse":{"Head":{"RequestAction":"","ErrorType":"Sender","ErrorCode":"9","ErrorMessage":"E009: Access Denied"},"Body":""}}

我无权访问服务器代码或服务器配置。我的目标是通过java代码发送相同的curl请求并获得相同的响应。

我使用的是java 8。

我错过了什么吗?

最佳答案

将查询参数附加到 url 解决了如下问题:-

URL obj = new URL(new StringBuilder(url).append("?").append(urlParameters).toString());
...
//wr.writeBytes(urlParameters);

关于java - Https 请求可与curl配合使用,但因HttpsURLConnection而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36517860/

相关文章:

java - 是否有可能获得同一个类中某个类的构造函数中的整数值?

java - 是否可以将外部文件/类以编程方式加载到位于工作空间外部的 Eclipse 编辑器中?

java - 我的java程序时不时地卡住并且可能存在内存泄漏。我的遥测有用吗?

php - 无法读取 DOMDocument 中的元重定向 URL

c# - 在 C# 中实现网络抓取工具

java - 为什么 HttpsURLConnection.getServer Certificates() 在 Java 6 和 Java 7 中返回不同的结果?

java - weblogic.net.http.SOAPHttpsURLConnection 无法转换为 javax.net.ssl.HttpsURLConnection

java - 自动识别Pitest中哪些测试用例杀死了哪些突变体

java - 使用 PDBOX 签署大 PDF 文件

php - Curl 不将值传递给 php 文件