【问题标题】:rest api call using java receiving response code 406使用java接收响应代码406的rest api调用
【发布时间】:2022-11-10 16:40:32
【问题描述】:

我正在尝试从 java 代码中调用 rest api。 api 调用应该接受参数。但是,我收到错误消息,因为“服务器返回 HTTP 响应代码:URL 为 406”。当我尝试发送请求正文时,它不会发送到 api。在应用程序日志中,我看到错误为 params=null。请帮忙。
下面是我的java代码。

我也试图在我不成功的地方使用 curl 来实现这一点。

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.Base64;

public class TestClass {

    public static final String POST_URL = "myurl";

    public static final String POST_DATA = 
            "{params: {\"page_num\":1,\"rows_per_page\":10001,\"sorting\":\"\",\"filter_rules\":\"{\\\"flt_domain\\\":[\\\"all\\\",\\\"LIQR\\\",\\\"MKTR\\\",\\\"NRCR\\\",\\\"RCRR\\\",\\\"UFIN\\\",\\\"ULIQ\\\"],\\\"flt_ownerDomain\\\":\\\"all\\\",\\\"flt_resolverDomain\\\":\\\"all\\\",\\\"flt_priority\\\":\\\"all\\\",\\\"flt_severity\\\":\\\"all\\\",\\\"flt_manuallyCreated\\\":\\\"all\\\",\\\"flt_migratedToUc\\\":\\\"all\\\",\\\"flt_relationshipType\\\":\\\"3\\\",\\\"flt_escalateEdmo\\\":\\\"all\\\",\\\"flt_status\\\":[\\\"7\\\",\\\"1\\\",\\\"3\\\",\\\"4\\\",\\\"5\\\",\\\"6\\\",\\\"8\\\",\\\"10\\\",\\\"9\\\"],\\\"flt_dataSource\\\":\\\"all\\\",\\\"flt_sourceSystem\\\":[\\\"all\\\"],\\\"flt_dqDimension\\\":\\\"all\\\",\"debug_mode\":\"yes\",\"all_fields\":\"true\",\"locale\":\"en\"} }   ";
        
    public static void main(String[] args) throws Exception {
        String[] details = {};
        System.out.println(Arrays.toString(details));
        System.out.println("PostData : " + POST_DATA);
        //URL line_api_url = new URL(POST_URL);
        String payload = POST_DATA;
        sendPostRequest(POST_URL, payload);
       }
    public static String sendPostRequest(String requestUrl, String payload) {
        try {
            System.out.println("URL Connection");
            URL url = new URL(requestUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            String userpass = username" + ":" + password;
            String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
            connection.setRequestProperty ("Authorization", basicAuth);
            System.out.println(" After Opening the connection");
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setUseCaches(false);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept", "application/json");
            connection.setRequestProperty("Content-Type", "application/json");
            OutputStream os = connection.getOutputStream();
            OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8");
            writer.write(payload);
            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));
            writer.close();
            StringBuffer jsonString = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null) {
                    jsonString.append(line);
            }
            br.close();
            connection.disconnect();
            return jsonString.toString();
        } catch (Exception e) {
                throw new RuntimeException(e.getMessage());
        }

    }
}

我尝试使用 java 代码和 curl 调用 rest api。我收到“406”错误。我期待 200 OK 的响应。 我试过在 Postman 中使用这个 api 调用,我得到了预期的结果。

除了java程序之外,还有其他方法可以自动化这个rest api调用吗?

【问题讨论】:

  • 我建议您不要使用 HttpURLConnection 类来发布数据。使用更合适的库,例如java9's httpclient
  • 您可以让 Postman 将您的工作 POST 请求格式化为 curl 命令行,然后在 curl 中执行该请求并将其与您自己的 curl 命令进行比较,以查看哪里出错了。
  • 我为 Curl 使用了邮递员的代码生成器,并在命令行中使用了相同的代码生成器。它也不起作用。我收到错误消息“与 443 相关的未知 SSL 协议错误:

标签: java rest


【解决方案1】:

SO上几乎没有相同类型的问题。请参阅这个问题和我的回答。看看它是否能解决你的问题:How to execute http requests in a Spring application without using WebFlux/RestTemplate (webmvc)?

【讨论】:

  • 不幸的是,没有..它没有帮助我。我不能使用 okhttp。
猜你喜欢
  • 2017-02-08
  • 2020-02-06
  • 2021-03-02
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多