gpt4 book ai didi

java - Spring Boot解析@RequestBody

转载 作者:行者123 更新时间:2023-11-30 01:58:08 25 4
gpt4 key购买 nike

我有一个旧端点,我正在尝试使用 Spring Boot 升级到它。它目前被一些服务使用,所以我想保持不变。

旧端点接受请求正文 userName=1234&password=1234 .

其调用方式的示例为 curl -X POST "http://localhost:8080/AuthService/login" -H "accept: */*" -H "Content-Type: application/json" -d "userName=123&password=123"

如何让 spring 完全像我的旧端点一样获取请求正文,但将输入映射到我的对象中?

旧端点使用 Apache Access,如下所示。它被配置为将类中的任何公共(public)方法转换为端点。

public RequestStatus login(String userName, String password) {
...
}

我已经将它翻译成 Spring Boot 像这样

@ApiOperation(value = "To login", response = RequestStatus.class)
@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<ReturnValue> login(@RequestBody() String info) {
Login login = new Login(info);
....
}


public class Login {

private String password;
private String userName;

public Login(String info) {
String[] values = info.split("&");
for (String value : values) {
String[] pair = value.split("=");
if (pair.length == 2) {
switch (pair[0]) {
case "password":
password = pair[1];
break;
case "userName":
userName = pair[1];
break;
}
}
}
}
}

但是将Request Body 转换为对象的方法确实很难看并且容易出错,我想改进它。

最佳答案

首先,将正文转换为 map :

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;
}

然后使用 Jackson 的 ObjectMapper 将 map 转换为您的 POJO

ObjectMapper mapper = new ObjectMapper();
Map<String, String> body = bodyToMap(info);
Login loginInfo = mapper.convertValue(body, Login.class);

您可以在此处检查更有效的查询参数样式字符串以映射转换器(如果您有更多旧端点具有相同的 key (例如 key1=value1_1&key1=value1_2&key2=value2_1)): Parse a URI String into Name-Value Collection

关于java - Spring Boot解析@RequestBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53716171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com