我有一个需求,其中一个rest API必须处理不同的请求json(30+不同的请求)。客户端可以发送任何json到这个端点,这个API应该能够处理请求。每个请求都有唯一的id。
交货:请求1:
{"Id":"1","name"john",
}
请求2:
{"Id":"2","name"john"lastname"cena"sex"F",
}
请求3:
{"Id":"3","mobileNumber"09 xxxxxxx0"email"nick@yahoo.com",
}
请求4:
{"Id":"4","pet"dog"color"black"sex"F",
}
现在,如何读取这个API的requestBody ?我们可以像下面这样使用JSONObject或JsonNode吗?
@PostMapping("/save-details")
public String postDetails(@RequestBody JSONObject request) {
return "";
}
@PostMapping("/save-details")
public String postDetails(@RequestBody JsonNode request) {
return "";
}
提前感谢您的帮助!
一个简单的解决方案是接受作为json字符串的请求,并使用Object映射器将其转换为所需的类型。
一个带有转换和动态输入主体的示例
package com.example.springmultirequest;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class DetailController {
Logger logger = LoggerFactory.getLogger(DetailController.class);
@PostMapping("/save-details")
public ResponseEntity<String> postDetails(@RequestBody Map<String, Object> request) {
JSONObject jsonObject = new JSONObject(request);
Integer idRequest = Integer.valueOf(jsonObject.get("Id").toString());
logger.info("idRequest: {}", idRequest);
switch (idRequest) {
case 1:
logger.info("Name: {}", jsonObject.get("name"));
break;
case 2:
logger.info("Name: {}", jsonObject.get("name"));
logger.info("Last name: {}", jsonObject.get("lastname"));
break;
case 3:
logger.info("mobileNumber: {}", jsonObject.get("mobileNumber"));
logger.info("email: {}", jsonObject.get("email"));
break;
case 4:
logger.info("pet: {}", jsonObject.get("pet"));
logger.info("color: {}", jsonObject.get("color"));
logger.info("sex: {}", jsonObject.get("sex"));
break;
default:
return ResponseEntity
.badRequest()
.body("Identification not recognized");
}
return ResponseEntity.ok().build();
}
}
示例响应:
. ____ _ __ _ _
/\ / ___'_ __ _ _(_)_ __ __ _
( ( )___ | '_ | '_| | '_ / _` |
\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.3)
o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
2021-02-27 12:52:37.406 INFO 17984 --- [nio-8080-exec-1] c.e.springmultirequest.DetailController : idRequest: 1
2021-02-27 12:52:37.406 INFO 17984 --- [nio-8080-exec-1] c.e.springmultirequest.DetailController : Name: john
2021-02-27 12:52:37.622 INFO 17984 --- [nio-8080-exec-6] c.e.springmultirequest.DetailController : idRequest: 2
2021-02-27 12:52:37.622 INFO 17984 --- [nio-8080-exec-6] c.e.springmultirequest.DetailController : Name: john
2021-02-27 12:52:37.622 INFO 17984 --- [nio-8080-exec-6] c.e.springmultirequest.DetailController : Last name: cena
2021-02-27 12:52:37.676 INFO 17984 --- [nio-8080-exec-8] c.e.springmultirequest.DetailController : idRequest: 3
2021-02-27 12:52:37.676 INFO 17984 --- [nio-8080-exec-8] c.e.springmultirequest.DetailController : mobileNumber: 09XXXXXXX0
2021-02-27 12:52:37.676 INFO 17984 --- [nio-8080-exec-8] c.e.springmultirequest.DetailController : email: nick@yahoo.com
2021-02-27 12:52:37.738 INFO 17984 --- [nio-8080-exec-5] c.e.springmultirequest.DetailController : idRequest: 4
2021-02-27 12:52:37.738 INFO 17984 --- [nio-8080-exec-5] c.e.springmultirequest.DetailController : pet: dog
2021-02-27 12:52:37.738 INFO 17984 --- [nio-8080-exec-5] c.e.springmultirequest.DetailController : color: black
2021-02-27 12:52:37.738 INFO 17984 --- [nio-8080-exec-5] c.e.springmultirequest.DetailController : sex: F
Read you json with @RequestBody Map<String,>请求,通过json解析器如Gson或Jackson解析你的json。
你可以使用
@PostMapping(value = "/example" )
public void abc(@RequestBody HashMap<String, String > requestData) {
System.out.println(requestData);
}