【问题标题】:POST JSON Object via RestTemplate in Spring Boot在 Spring Boot 中通过 RestTemplate POST JSON 对象
【发布时间】:2019-06-20 09:22:33
【问题描述】:

我正在尝试将 JSON 对象发布到接受以下格式数据的 API 端点

{
    "names": [
        "name1",
        "name2",
        "name3"
    ]
}

我的post方法如下

public String post(List<String> names) {

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    JSONObject jsonObject = new JSONObject();
    jsonObject .put("names", names);

    HttpEntity<JSONObject> entity = new HttpEntity<>(jsonObject , headers);

    return restTemplate.postForObject(Constants.URL, entity, String.class);
}

当我调用 post 方法时出现此错误

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request

我打印了jsonObject 并尝试通过 Postman 发布它,它成功了。

我在这里缺少什么?

任何帮助将不胜感激。

【问题讨论】:

  • 你想试试这种方式吗?或者你为什么不使用 POJO 类?
  • 我也试过了,出现404错误。
  • 那是代码问题,你能补充更多信息,请求和响应的请求类型是什么?邮递员到底有什么用?

标签: java json spring-boot post resttemplate


【解决方案1】:

使用names创建JSONArray对象,然后在jsonObject.put("names", jsonArrayObject);中设置json数组

【讨论】:

    【解决方案2】:

    我猜你不需要做这一切

    public String post(List<String> names) {
    
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    
    JSONObject jsonObject = new JSONObject();
    jsonObject .put("names", names);
    
    HttpEntity<JSONObject> entity = new HttpEntity<>(jsonObject , headers);
    
    return restTemplate.postForObject(Constants.URL, entity, String.class);
    

    }

    使用 POJO 可以轻松完成

    创建一个 POJO,

       @Entity
        class Name{
       @JsonProperty
        private String name1;
        getter(); setter();}
    

    创建你的 post 方法,你可以像在 pojo 中那样传递确切的对象

    @PostMapping("/RESTENDPOINT")
    public String post(@RequestBody Name name) {
        return repository.save(name); // your logic
    }
    

    【讨论】:

      【解决方案3】:

      参考baeldung.com,rest-template sample。可以使用HttpEntity,T不是JSONObject而是POJO类型,LIKE:

      HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
      ReturnType result = restTemplate.postForObject(fooResourceUrl, request, ReturnType.class);
      

      HttEntity is 表示一个 HTTP 请求或响应实体,由 headers 和 body 组成。 通常与RestTemplate结合使用

      【讨论】:

        【解决方案4】:

        在您的情况下,直接通过 RestTemplate 发布 JsonObject 不起作用的原因是 RestTemplate 使用的是 Jackson Serializer - 而不是 toString 方法。 Serializer 将获取类的内部结构并将其转换为 json 表示,其中 toString() 方法为您提供您期望的 json 数据。

        在您的情况下,序列化时的内部表示将如下所示:

        "names":{"chars":"namesstring","string":"namesstring","valueType":"STRING"}

        这不是您期望的结构,但它部分是 JsonObject 在内部存储您的 json 结构的方式。 (捕获类型信息等)。

        但是,当您调用 toString() 时,JsonObject 会为您提供您所期望的(即没有所有元数据的 json 表示)。

        因此,简而言之,您认为自己发送的内容与实际发送的内容是不同的。您遇到的 400 错误可能是因为您调用的端点拒绝了数据的实际格式。

        您可以通过使用拦截器调试 RestTemplate 进行的实际调用来亲自了解这一点。或者,让您的客户端调用回显服务以查看有效负载。

        【讨论】:

          猜你喜欢
          • 2020-06-25
          • 1970-01-01
          • 2011-05-03
          • 1970-01-01
          • 2022-08-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多