SpringBoot将多值HTTP头映射到类
通过使用,我们可以定义一些首选项,这些首选项是我们希望在发出REST请求时使用的。例如,我们可以定义Update PUT请求是否应该返回资源。对我来说,这是一个非常好的方法来定义我们到底需要什么 首选项是使用名为prefere的HTTP头定义的。由于@RequestHeader注释,我们可以轻松地在控制器中获得请求头,但是我们需要一些样板代码来处理给定头,因为给定值是字符串,但它包含键值数组。以以下请求为例:SpringBoot将多值HTTP头映射到类,spring,spring-boot,Spring,Spring Boot,通过使用,我们可以定义一些首选项,这些首选项是我们希望在发出REST请求时使用的。例如,我们可以定义Update PUT请求是否应该返回资源。对我来说,这是一个非常好的方法来定义我们到底需要什么 首选项是使用名为prefere的HTTP头定义的。由于@RequestHeader注释,我们可以轻松地在控制器中获得请求头,但是我们需要一些样板代码来处理给定头,因为给定值是字符串,但它包含键值数组。以以下请求为例: POST /foo HTTP/1.1 Host: example.org Prefer
POST /foo HTTP/1.1
Host: example.org
Prefer: handling=lenient, wait=100, respond-async
Date: Tue, 20 Dec 2011 12:34:56 GMT
在给定的请求中,我们有3个参数,我们需要编写代码将给定的字符串拆分为令牌,然后再拆分为键值对,并且不需要说明某些参数可能具有无效值,例如整数可能是字符串或缺少某些值
但是如果我们能够将标题映射到一个类中,那就太棒了。具有默认值和硬类型,如整数和字符串。弹簧中是否有自动调节的机制?我的意思是,我们可以为一个标题定义一个类而不是一组标题,然后spring将标题中的参数映射到指定的类吗?PropertyEditorSupport在某种程度上满足您的需求。根据您的需要,可能是也可能不是更清洁的解决方案
定义一个PreferHeader类,类似于:
public class PreferHeader {
private String handling = "default_ handling";
private Integer wait = 20;
private String respond = "async";
// Getters & Setters...
}
扩展PropertyEditorSupport类并将其更改为更干净:
import java.beans.PropertyEditorSupport;
public class HeaderConverter extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
Headers headers = new Headers();
if(text.length()==0) return headers;
String []tokens=text.split(",");
for(String token: tokens) {
String[] values = token.split("=");
if (token.trim().startsWith("handling")) {
headers.setHandling(values[1].trim());
} else if (token.trim().startsWith("wait")) {
headers.setWait(Integer.parseInt(values[1].trim()));
} else if (token.trim().startsWith("respond")) {
headers.setRespond(values[1].trim());
}
}
setValue(headers);
}
}
控制器类中的更改:
@GetMapping(value= "/data")
public @ResponseBody
String postAccountData(@RequestHeader(value="Prefer", defaultValue = "") Headers headers) {
return "Wait is: " + headers.getWait();
}
.
.
.
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Headers.class,
new HeaderConverter());
}
我认为该方法存在以下几个问题:
在控制器方法中指定defaultValue=。
拆分或管理HeaderConverter类中的数据。如果您能在这个类中正确掌握您的标记化,那么解决方案的其余部分将是直截了当的。
请求和答复:
卷曲
等待时间是:20
curl首选:handling=test,wait=10000,respond=async
等待时间:10000