我有一个旧的端点,我正在尝试升级到使用Spring Boot。目前有一些服务使用它,因此我希望保持不变。
旧端点接受=G11
的请求正文。
例如=G17
我怎样才能像我以前的终结点一样完全接受请求正文,却可以将输入映射到对象中呢?
旧的端点正在使用Apache Access,就像这样。它被配置为将类中的任何公共方法转换为端点。
userName=1234&password=1234
我已经将它翻译成Spring Boot了
curl -X POST "http://localhost:8080/AuthService/login" -H "accept: */*" -H "Content-Type: application/json" -d "userName=123&password=123"
但是将请求主体转换为对象的方法确实很丑陋且容易出错,我想对其进行改进。
答案 0 :(得分:1)
Spring Boot将自动为您将json映射到对象。只需在请求正文注释后删除括号,使参数类型登录,然后从登录名中删除构造函数即可。
@ApiOperation(value = "To login", response = RequestStatus.class)
@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<ReturnValue> login(@RequestBody Login login) {
....
}
public class Login {
private String password;
private String userName;
.... // getters
}
答案 1 :(得分:1)
首先,将主体转换为地图:
public Map<String, String> bodyToMap(String bodyStr) {
Map<String, String> body = new HashMap<>();
String[] values = bodyStr.split("&");
for (String value : values) {
String[] pair = value.split("=");
if (pair.length == 2) {
body.put(pair[0], pair[1]);
}
}
return body;
}
然后使用杰克逊的ObjectMapper
将地图隐藏到您的POJO中
ObjectMapper mapper = new ObjectMapper();
Map<String, String> body = bodyToMap(info);
Login loginInfo = mapper.convertValue(body, Login.class);
您可以在此处检查更有效的queryparam样式的字符串以映射转换器(如果您有更多具有相同密钥(例如key1=value1_1&key1=value1_2&key2=value2_1
的旧式端点,则应该这样做):Parse a URI String into Name-Value Collection
答案 2 :(得分:0)
在您的方法中添加consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE
,还将您的输入参数更改为@RequestParam
映射。
@RequestMapping(value = "/login", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public @ResponseBody ResponseEntity<ReturnValue> login(@RequestParam Map<String, String> body) {
String username = body.get("username");
String password = body.get("password");
//authenticate etc..
return ResponseEntity.ok(returnValue);
}