【问题标题】:Java: Request body in XML or JSON without using StringJava:以 XML 或 JSON 格式请求正文而不使用字符串
【发布时间】:2021-12-17 03:29:24
【问题描述】:

我正在使用 Spring Boot(使用 Java)开发应用程序。 这个应用程序必须调用几个外部服务,每个服务需要一个复杂的主体(在 json 或 xml)(这个输入可以变化!我传递给它的字段不是必需的,所以有时我什至可能传递这些字段的子集)。以下是服务可以接收的输入示例:

{
  "field1": "string",
  "field2": "string",
  "field3": "string",
  "field4": 0,
}

<input>
    <input1>my_string</input1>
    <input2>my_string</input2>
</input>

我使用 RestTemplate 进行 HTTP 调用。这是一个例子。我使用 Java 字符串对 HTTP 正文进行建模(但它有一个很大的缺陷,即 它不可编辑而是硬编码!):

    String Jsonbody = "{\r\n"
            + "  \"field1\": \""+myString1+"\"\r\n" 
            + "  \"field2\": \""+myString2+"\"\r\n"
            + "}";

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> request = new HttpEntity<String>(Jsonbody, headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<MyResponseClass> response = restTemplate.postForEntity(url, request, MyResponseClass.class);

JsonBody 变量中这样硬编码正文是非常糟糕的。有什么方法可以让我动态插入字符串并自动创建 JSON 对象(然后我可以将其转换为字符串以放入 .postForEntity 方法中)? XML 输入类型也有同样的问题。

【问题讨论】:

    标签: java json spring spring-boot http


    【解决方案1】:

    GsonJackson 等多个库实际上允许您使用 JSON,因为它们是 Java 对象,最终将它们序列化为一个主体。

    如果你想尝试一下,你只需要包含 Gson 作为依赖:

    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.9</version>
    </dependency>
    

    那么你必须为你的 POST 正文创建一个 POJO:

    public class JsonBody {
    
      private List<String> fields = new LinkedList<>();
    
      void addField(String field) {
        fields.add(field);
      }
    
    }
    

    您可以随意添加任意数量的String,以便之后对其进行解析。

    JsonBody jsonBody = new JsonBody();
    Gson gson = new Gson();
    
    jsonBody.addField(myString1);
    jsonBody.addField(myString2);
    
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<String> request = new HttpEntity<String>(gson.toJson(jsonBody), headers);
    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<MyResponseClass> response = restTemplate.postForEntity(url, request, MyResponseClass.class);
    

    这会将您的 JSON 设置为:

    {
      fields: [
        contentMyString1,
        contentMyString2
      ]
    }
    

    考虑到前面的示例,您可以根据需要以 POJO 的形式修改和格式化 JSON,并使用 Gson 中的 Gson::toJson(String) 函数。

    当然,如果你只是创建一个 POJO 为:

    public class JsonBody {
    
      private String field1;
      private String field2;
      private String field3;
      private Integer field4;
    
    }
    

    那么输出将与您在初始示例中的输出相同。

    【讨论】:

      【解决方案2】:

      像这样使用ObjectMapper 类...

      ObjectMapper objectMapper = new ObjectMapper();
      Car car = new Car("yellow", "renault");
      objectMapper.writeValue(new File("target/car.json"), car);
      

      输出将是

      {"color":"yellow","type":"renault"}
      
      

      这里有更多关于主题https://www.baeldung.com/jackson-object-mapper-tutorial的数据

      同样的方法用于将对象映射到 XML (https://www.baeldung.com/jackson-xml-serialization-and-deserialization)

      【讨论】:

      • ObjectMapper 不是 JDK 中默认包含的类,因此如果您在答案中包含您所指的依赖项会很好(在本例中为 jackson-databind但这不是读者需要知道的)。该问题还明确询问如何将 JSON 生成为 String 以便将其用作 POST 正文,而不是将其写入文件(可以使用 ObjectMapper::writeValueAsString 函数完成,但读者也不需要要知道)。
      猜你喜欢
      • 2012-08-22
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2018-03-27
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      相关资源
      最近更新 更多