Java:以 XML 或 JSON 格式请求正文而不使用字符串

Posted

技术标签:

【中文标题】Java:以 XML 或 JSON 格式请求正文而不使用字符串【英文标题】:Java: Request body in XML or JSON without using String 【发布时间】: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 输入类型也有同样的问题。

【问题讨论】:

【参考方案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 函数完成,但读者也不需要要知道)。

以上是关于Java:以 XML 或 JSON 格式请求正文而不使用字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何以文本或字符串格式而不是 HTML 格式获取电子邮件的正文

在 Postman 的请求正文中传递多个 JSON 数据并使用 Jersy(JXRS) 进入 Java Rest API

使用 RestKit 以 XML 格式发送 post 请求

.net core 杂记:WebAPI的XML请求和响应

JSON 请求正文 - 客观 c 格式

Java获取HTTP请求参数 包括form表单json格式xml格式