我们可以创建一个单一的rest API(单一端点),可以处理不同的请求结构(JSON)在春季启动? &



我有一个需求,其中一个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);
}

最新更新