【问题标题】:Spring RestTemplate POST request is not working with HttpEntity<String>Spring RestTemplate POST 请求不适用于 HttpEntity<String>
【发布时间】:2018-12-05 06:23:06
【问题描述】:

我无法使用 HttpEntity 为 POST 请求调用 Spring RestTemplate。 我对 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)

我的实现是:

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();

我尝试了以下解决方案,但没有奏效 here

this 我也提到了this

【问题讨论】:

    标签: java spring http-headers resttemplate


    【解决方案1】:

    您可以使用 HttpMessageConverter 请求您对 HttpEntity 的 restTemplate 调用。 它可以从 HTTP 请求和响应中读取和写入字符串。

    来自doc:默认情况下,此转换器支持所有文本媒体类型 (text/*),并使用 text/plain 的 Content-Type 进行写入。

    您可以通过如下实现 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);
    

    然后根据您的请求调用 restTemplate。

    【讨论】:

    • 它的工作。谢谢。 HttpMessageConverter 将响应解析为 base64 字符串。
    【解决方案2】:

    请尝试以下代码可能对您有所帮助:

     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();
           }
    

    【讨论】:

      【解决方案3】:

      试试这些实用方法:

      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;
      }
      

      这两种方法在哪里

      • 实体:您的输入对象
      • restUrl:你的网址
      • HttpMethod:POST/GET
      • entityClass:来自服务器的预期输出对象

      【讨论】:

      • 感谢您的回复。我试过了,但没有用。
      • @cpatel 请在此处发送您的输入数据
      • 嗨,添加这 3 行就可以了。谢谢。最终 HttpEntity 请求 = new HttpEntity(searchRequestInput, headers); List> messageConverters = new ArrayList>(); messageConverters.add(new StringHttpMessageConverter());
      猜你喜欢
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 2016-05-29
      • 2016-11-03
      相关资源
      最近更新 更多