当我在RestTemplate上通过POST发送请求数组时,我收到错误400

时间:2017-06-12 21:10:25

标签: java json spring rest resttemplate

有一项名为

的外部服务

http://externalServer:9000/pathServer/serviceCalled

此服务作为输入参数接收对象列表。

class BarSpecialMsg extends BarBaseMsg implements SpecialMsg {
  private CommonSpecialMsg composedSpecialMsg;
 ...
}

class FooSpecialMsg extends BarBaseMsg implements SpecialMsg {
  private CommonSpecialMsg composedSpecialMsg;
 ...
}

在我的后端,我打电话给这项服务,因为它不在我的域中。为此,我使用了Spring的RestTemplate。

我已经使用过这个,但是当我拨打电话时,它会给我一个400错误的请求错误。

这是我的代码。

Request
    [
        { "atr1" : "value" },
        { "atr1" : "value" },
        { "atr1" : "value" },
        { "atr1" : "value" }
    ]

STResponse的输出打印是

enter image description here

我知道请求是正确的,因为当我用邮递员发送它时,它工作正常。

enter image description here

我做错了什么?

3 个答案:

答案 0 :(得分:0)

您是否尝试过使用RequestEntity而不是HTTPEntity?

Spring的javadoc有一个你可以遵循的例子。

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/RequestEntity.html

答案 1 :(得分:0)

正如在评论中已经说过的那样,尝试使用一个名为Request的字段atr1,以及一个名为Result和{{1}的两个字段code的其他类message }}:

class Request {
    private String atr1;
    // getter, setter
}

class Result {
    private String code;
    private String message;
    // getter, setter
}

然后

List<Request> data = new ArrayList<>();
Request req1 = new Request();
req1.setAtr1("value");
data.add(req1);
Request req2 = new Request();
req2.setAtr1("value");
data.add(req2);

String url = "http://externalServer:9000/pathServer/serviceCalled";
ResponseEntity<Result> response = restTemplate.postForEntity(url, data, Result.class);

答案 2 :(得分:0)

我在删除方法中使用rest模板遇到了这个问题,经过长时间的调试后才发现它!这个问题与在rest模板中使用ClientHttpRequestFactory类的错误配置有关,使用另一个SimpleClientHttpRequestFactory之类的东西,依此类推,例如我使用下面的代码来支持正文消息的所有方法:

public class CustomSimpleClientHttpRequestFactory extends 
    SimpleClientHttpRequestFactory {

    @Override
    protected void prepareConnection(HttpURLConnection connection, String httpMethod) 
    throws IOException {
        super.prepareConnection(connection, httpMethod);

        connection.setDoOutput(true);
    }
}

并在RestTemplate中对其进行配置,如下所示:

RestTemplate restTemplate = new RestTemplate(new CustomSimpleClientHttpRequestFactory());
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
/* and other configure you like*/