当前位置: 首页 > 知识库问答 >
问题:

Spring RestTemplate POST请求无法与HttpEntity一起使用

丁志勇
2023-03-14

我不能用HttpEntity调用Spring RestTem板进行POST请求。我调用RestTem板给出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();

我尝试过以下解决方案,但在这里不起作用

这个我也提到过这个

共有3个答案

子车新立
2023-03-14

尝试以下实用方法:

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:你的url
  • Httpmethod: POST/GET
  • entityClass:期望从服务器输出对象
景宏盛
2023-03-14

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

 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();
       }
易炳
2023-03-14

您可以使用HttpMessageConzer请求HttpEntity的restTem板调用。其中可以读写来自HTTP请求和响应的Strings。

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

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

然后用您的请求调用restTem板。

 类似资料:
  • 我有一个问题,在我的应用程序Android中使用soap请求。我使用Ksoap2库。这是我的代码: }

  • 问题内容: 我的程序应该等待按下向左或向右箭头键,然后更改一个值,以便下次更新PaintComponent时,屏幕看起来有所不同。但是,运行该程序时,屏幕没有变化。 以下是变量声明: 这是主要的KeyListener声明: 这是用于绘画的方法: 当我运行该程序时,该程序会打印外壳,但是当我按箭头键时,屏幕上没有任何变化。 问题答案: 您需要先将关键侦听器添加到组件,然后才能调用它: 您还需要使组件

  • 问题内容: click事件可以正常运行,但是onmouseover事件不起作用。 问题答案: 您需要大写一些字母。

  • 问题内容: 我需要为我的应用程序读/写锁。我已阅读 https://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock 并写了我自己的类,因为在swift中没有读/写锁 效果很好,直到我尝试从GCD线程使用它。 当我尝试在某个时刻从不同的异步块使用此类时,它允许在写入被锁定时进行写入 这是示例日志: 因此,您可以看到g被锁定,但是objc_sync_

  • 问题内容: 我在用Java做一个小Gui。我正在使用setBounds方法在JFrame上设置按钮等的位置,但是问题是,当我将JPanel按钮与JFrame一起使用时,在JFrame上不可见,并且如果没有JPanel也可以,请同时阅读代码,并请帮帮我我是初学者,正面临这些愚蠢的问题。 这个很好 当我将按钮添加到Jpanel时,相同的代码不起作用,所以怎么了,请指导我 请帮我解决这个小问题 问题答案

  • 我目前正在将IntelliJ IDE用于复杂的GWT项目。我想在GWT的开发模式中利用JRebel,所以最近我为IntelliJ安装了JRebel插件,但在使其工作时遇到了麻烦。 基本上IntelliJ不具备在更改时自动编译应用程序的能力,所以每当您对代码进行更改时,我都必须进行编译- 信息:使用JavaC1.7.0_21编译java源代码信息:15个错误信息:0个警告信息:编译完成,9分钟5秒内