简体   繁体   English

Spring RestTemplate POST请求不适用于HttpEntity <String>

[英]Spring RestTemplate POST request is not working with HttpEntity<String>

I am not able to call Spring RestTemplate with HttpEntity for POST request. 我无法使用HttpEntity调用Spring RestTemplate进行POST请求。 My call to RestTemplate gives Base64 string in Postman but using my java implementation it gives following error: 我对RestTemplate的调用在Postman中给出了Base64字符串,但是使用我的Java实现,它给出了以下错误:

java.lang.IllegalArgumentException: Illegal base64 character 5b
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at java.util.Base64$Decoder.decode(Base64.java:549)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

My implementation is: 我的实现是:

final HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_XML);
            final HttpEntity<String> request = new HttpEntity<String>(searchRequestInput, headers);

            final ResponseEntity<String> postForEntity = restTemplate
                    .postForEntity(baseURL, request, String.class);

            String response = postForEntity.getBody();

I have tried following solutions, but it didn't work here 我尝试了以下解决方案,但在这里不起作用

and this Also I have refered this 也我已经refered

You can use HttpMessageConverter to request your restTemplate call for HttpEntity. 您可以使用HttpMessageConverter请求对HttpEntity的restTemplate调用。 Which can read and write Strings from the HTTP request and response. 可以从HTTP请求和响应中读取和写入字符串。

From doc : By default, this converter supports all text media types (text/*), and writes with a Content-Type of text/plain. From doc :默认情况下,此转换器支持所有文本媒体类型(text / *),并使用Content / Type的text / plain进行写入。

You can try this by implementing StringHttpMessageConverter as below: 您可以通过实现StringHttpMessageConverter来尝试此操作,如下所示:

            final HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_XML);
            final HttpEntity<String> request = new HttpEntity<String>(searchRequestInput, headers);
            List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
            messageConverters.add(new StringHttpMessageConverter());
            restTemplate.setMessageConverters(messageConverters);

then call restTemplate with your request. 然后使用您的请求调用restTemplate。

Try these utility methods: 尝试以下实用程序方法:

public static <T> ResponseEntity<T> makeRestRequest(Object entity, String restUrl, HttpMethod method, Class<T> entityClass) {
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity httpEntity = makeHttpEntity(entity);
    ResponseEntity<T> response = null;

    try {
        response = restTemplate.exchange(restUrl, method, httpEntity, entityClass);
    } catch (HttpClientErrorException e) {
        e.printStackTrace();
        return new ResponseEntity<>(e.getStatusCode());
    }

    return response;
}

public static <T> HttpEntity makeHttpEntity(T entity) {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_XML);
    HttpEntity<T> httpEntity = new HttpEntity<>(entity, headers);
    return httpEntity;
}

Where in the these two method 这两种方法在哪里

  • entity: your input object 实体:您的输入对象
  • restUrl: your url restUrl:您的网址
  • HttpMethod: POST/GET HttpMethod:POST / GET
  • entityClass: expected output object from the server EntityClass:服务器的预期输出对象

Please try with below code may it help you: 请尝试以下代码,它可能对您有帮助:

 final HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_XML);
    HttpEntity requestEntity;
    if (entity instanceof String) {
        requestEntity = new HttpEntity(headers);
    } else {
        requestEntity = new HttpEntity(searchRequestInput, headers);
    }
       try {
        String response  =  restTemplate.exchange(baseURL, HttpMethod.POST, requestEntity, String.class).getBody().toString());
       } catch (HttpServerErrorException | HttpClientErrorException e) {
        e.printStackTrace();
       }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM