【问题标题】:Send HTTP POST request in Java with Basic Auth and request body使用基本身份验证和请求正文在 Java 中发送 HTTP POST 请求
【发布时间】:2018-10-10 21:45:51
【问题描述】:

我正在尝试通过 Java 向 ServiceNow REST API 发送 HTTP 请求并创建一个事件。

我在 Postman 有这个工作: 网址:POST https://<domain>.service-now.com/api/now/table/em_event

正文:

{
    "source":"Postman",
    "node":"Codys Mac",
    "type":"Test",
    "resource":"Test",
    "metric_name":"Testing",
    "event_class":"Test",
    "severity":"4",
    "description":"This is a test event, created from REST API.",
}

它工作正常,没有问题。

但在 Java 中,我只有问题。

我发现我试图遵循的最简单的例子是:https://kodejava.org/how-do-i-send-an-http-post-request/

我的代码:

    public void post(){
        HttpClient client = HttpClientBuilder.create().build();
        HttpPost post = new HttpPost(serviceNowURL);

        List<NameValuePair> arguments = new ArrayList<>();
        arguments.add(new BasicNameValuePair("source", "Sample Producer"));
        arguments.add(new BasicNameValuePair("node", "Codys Mac"));
        arguments.add(new BasicNameValuePair("type", "Test Event Type"));
        arguments.add(new BasicNameValuePair("resource", "Test Event Resource"));
        arguments.add(new BasicNameValuePair("metric_name", "Test Event Metric Name"));
        arguments.add(new BasicNameValuePair("event_class", "Test Event Class"));
        arguments.add(new BasicNameValuePair("sevrity", "5"));
        arguments.add(new BasicNameValuePair("description", "This is a test event, created by SampleProducer App usign REST API."));

        try{
            String encoding = Base64.getEncoder().encodeToString((username.concat(":").concat(password)).getBytes("UTF-8"));

            post.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
            post.setHeader(HttpHeaders.ACCEPT, "application/json");
            post.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + encoding);
            post.setEntity(new UrlEncodedFormEntity(arguments));
            HttpResponse response = client.execute(post);
        }
        catch(Exception e){
            System.out.println(ExceptionUtils.getRootCauseMessage(e));
        }
    }

但是每当我运行它时,我在java.lang.NoSuchFieldError: INSTANCEHttpClientBuilder.create().build() 的第一行遇到异常,我不知道为什么。

有谁知道我做错了什么,或者我可以通过其他方式解决这个问题吗?

【问题讨论】:

    标签: java apache http post


    【解决方案1】:

    根据此 QA:HttpClientBuilder - java.lang.NoSuchFieldError: INSTANCE,您有混合的不兼容版本的 httpcorehttpclient Apache HTTP 客户端的依赖项。

    建议:调查临时依赖关系并尝试通过从依赖关系列表中删除导致该问题的库来解决冲突,或者在您的项目pom.xml 中明确定义这两个库,例如:

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.4.10</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.6</version>
    </dependency>
    

    注意:我为httpclient 库选择了最新 兼容版本。这可能会在未来发生变化,或者可能与您当前使用的 httpclient 版本不匹配。

    【讨论】:

      【解决方案2】:
              CloseableHttpClient httpclient = HttpClients.createDefault();
      

      这对我有用,您不必使用连接管理器打开和关闭连接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-23
        • 2014-02-17
        相关资源
        最近更新 更多