对公共https:// Web服务的Java HTTP POST请求

时间:2018-01-08 20:13:55

标签: java http post https

我尝试向公共https://网络服务发送POST请求。 这是我的代码段:

static void xPostJsonUsingHttpClient() 
       throws ClientProtocolException, IOException {
    CloseableHttpClient client = HttpClients.createDefault();
    String anafURL = 
    "https://webservicesp.anaf.ro/PlatitorTvaRest/api/v2/ws/tva";
    HttpPost httpPost = new HttpPost(anafURL);

    String json = "[{\"cui\":19,\"data\":\"2017-11-07\"}]";

    StringEntity entity = new StringEntity(json,"UTF-8");

    entity.setContentType("application/json");
    httpPost.setHeader("Accept", "application/json");
    httpPost.setHeader("Content-Type", "application/json");
    httpPost.setEntity(entity);

    CloseableHttpResponse response = client.execute(httpPost);
    System.out.println(response);

    client.close();
}       

成为https://地址我不知道,我必须改变什么? Postman或SoapUI可以正常使用它。

当我运行我的代码时,它会以错误终止: javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径

我是否需要下载公钥或者我必须进行一些其他设置?

谢谢

2 个答案:

答案 0 :(得分:0)

猜测但我相信您的JVM无法识别此Web服务器使用的证书的CA.我不久前遇到了同样的问题,以下是有帮助的:

您尝试连接的网址,使用" certsign.net"作为证书颁发机构

  1. certsign下载CA.
  2. 然后使用this guide
  3. 导入它

    之后你应该可以连接。如果不让我知道。

答案 1 :(得分:0)

您可以使用基于apache http api构建的http-request

rivate static final HttpRequest<?> HTTP_REQUEST = 
 HttpRequestBuilder.createPost("https://webservicesp.anaf.ro/PlatitorTvaRest/api/v2/ws/tva")
        .trustAllCertificates()
        .trustAllHosts()
        .addDefaultHeader(ACCEPT, APPLICATION_JSON.getMimeType())
        .addContentType(APPLICATION_JSON)
        .build();

@Test
public void test() {
    ResponseHandler<?> responseHandler = 
            HTTP_REQUEST.executeWithBody("[{\"cui\":19,\"data\":\"2017-11-07\"}]");
    assertEquals(SC_OK, responseHandler.getStatusCode());
}

状态代码没问题。如果要获取响应正文,可以使用String或sometype而不是通配符类型。请参阅文档。