簡體   English   中英

BadRequest 400,同時嘗試使用POST RestTemplate調用外部API

[英]BadRequest 400 while trying to call a external API using POST RestTemplate

我必須在Java Spring中調用一個外部API,在該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]

您沒有發送正確的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);

我想您不是將Object轉換為JSON。

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

希望這將有助於使用fullHeader提到的HttpHeaders和HttPEntity

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM