【问题标题】:BadRequest 400 while trying to call a external API using POST RestTemplate尝试使用 POST RestTemplate 调用外部 API 时出现 BadRequest 400
【发布时间】:2020-01-07 06:29:32
【问题描述】:

我必须在 Java Spring 中调用一个外部 API,在其中我必须按如下方式传递 JSON 对象(XXX 和 YYY 是参数)。如何使用以下类传递这个 JSON 对象?

{
  "codecConfigId": "XXXXXXXX", 
  "inputStreams": [{
    "inputId": "Input_Teste_1024_1",
    "inputPath": "YYYYYYYYYYYYY",
    "selectionMode": "AUTO"
  }]
}

我尝试了什么


StreamsForCodecs streams = new StreamsForCodecs();
streams.setCodecConfigId(codecConfigId);
streams.setInputStream(path.toString());

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
HashMap<String, String> map = new HashMap<String, String>();
map.put("Content-Type", "application/json");
map.put("x-api-key", "XXXXXXX");
map.put("Accept", "application/json");

StreamsForCodecs 是一个与另一个类相关联的类,因为我需要传递上面的 JSON,所以我创建了这两个类。

public class StreamsForCodecs implements Serializable {

    private static final long serialVersionUID = 1L;
    private String codecConfigId;
    ArrayList<InputStreamsCodec> inputStreams = new ArrayList<InputStreamsCodec>();

...
    // Setter Methods

    public void setCodecConfigId(String codecConfigId) {
        this.codecConfigId = codecConfigId;
    }

    public void setInputStream(String path) {
        InputStreamsCodec inputStreamsCodec = new InputStreamsCodec();
        inputStreamsCodec.setInputPath(path);
        inputStreams.add(inputStreamsCodec);
    }

}

class InputStreamsCodec implements Serializable {

    private static final long serialVersionUID = 1L;
    private String inputPath;
...
Some GetAndSetters

    public void setInputPath(String inputPath) {
        this.inputPath = inputPath;
    }
}

我也尝试了requestEntityrequestRestTemplate.postForEntityRestTemplate.exchange,但在所有情况下我都收到了错误的请求。当我尝试从 POSTman 调用它时,我没有收到错误消息。

HttpEntity<StreamsForCodecs> requestEntity = new HttpEntity(streams, headers);
request = new HttpEntity(requestEntity, headers);
ResponseEntity<StreamsForCodecsResponse> response= new RestTemplate().exchange(url, HttpMethod.POST, requestEntity, StreamsForCodecsResponse.class);
//ResponseEntity<StreamsForCodecsResponse> response= new //RestTemplate().postForEntity(url, request, StreamsForCodecsResponse.class);
System.out.println(response.getBody());

这是异常堆栈跟踪的一部分。

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request
    at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:79) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:579) ~[spring-web-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at com.carlosdv93.controller.CreateStreamsForCodecs.createStreamsForCodecsPOST(CreateStreamsForCodecs.java:42) ~[classes/:na]

【问题讨论】:

    标签: java json spring resttemplate httpentity


    【解决方案1】:

    您没有发送正确的 http 标头,您将所有正确的标头放在 map 对象中但从未发送过,更改您的代码并填充 headers 对象而不是 map nad 并使用请求:

    MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
    headers.add("Content-Type", "application/json");
    headers.add("x-api-key", "XXXXXXX");
    headers.add("Accept", "application/json");
    

    您也可以使用HttpHeaders 来设置标题:

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType. APPLICATION_JSON);
    headers.set("x-api-key", "XXXXXXX");
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    HttpEntity<StreamsForCodecs> requestEntity = new HttpEntity<>(streams, headers);
    ResponseEntity<StreamsForCodecsResponse> response = new RestTemplate().exchange(url, HttpMethod.POST, requestEntity, StreamsForCodecsResponse.class);
    

    【讨论】:

    • 我按照你说的做了,但是没有用。 MultiValueMap&lt;String, String&gt; headers = new LinkedMultiValueMap&lt;String, String&gt;(); headers.add("Content-Type", "application/json"); headers.add("x-api-key", "XXXXXXX"); headers.add("Accept", "application/json"); 并发送它,继续 400 BadRequest。
    • 我编辑了我的评论@Fullstack Guy,但同样是错误的请求错误
    • @CarlosDv93Dev 尝试使用HttpHeaders,就像我展示的那样。
    • @CarlosDv93Dev 只需检查您的类路径中是否有杰克逊
    • 我做了更改,但仍然不起作用,同样的错误。我的 pom.xml 中有 Jackson 核心依赖项
    【解决方案2】:

    我猜你没有将你的对象转换为 JSON。

        JSONObject requestJson = new JSONObject(streams).toString();
        HttpEntity<StreamsForCodecs> requestEntity = new HttpEntity<>(requestJson , headers);
    

    希望这会有所帮助 使用fullstack guy提到的HttpHeaders和HttPEntity

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2019-09-15
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多