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】:Gson 或 Jackson 等多个库实际上允许您使用 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