SpringBoot将多值HTTP头映射到类

SpringBoot将多值HTTP头映射到类,spring,spring-boot,Spring,Spring Boot,通过使用,我们可以定义一些首选项,这些首选项是我们希望在发出REST请求时使用的。例如,我们可以定义Update PUT请求是否应该返回资源。对我来说,这是一个非常好的方法来定义我们到底需要什么 首选项是使用名为prefere的HTTP头定义的。由于@RequestHeader注释,我们可以轻松地在控制器中获得请求头,但是我们需要一些样板代码来处理给定头,因为给定值是字符串,但它包含键值数组。以以下请求为例: POST /foo HTTP/1.1 Host: example.org Prefer

通过使用,我们可以定义一些首选项,这些首选项是我们希望在发出REST请求时使用的。例如,我们可以定义Update PUT请求是否应该返回资源。对我来说,这是一个非常好的方法来定义我们到底需要什么

首选项是使用名为prefere的HTTP头定义的。由于@RequestHeader注释,我们可以轻松地在控制器中获得请求头,但是我们需要一些样板代码来处理给定头,因为给定值是字符串,但它包含键值数组。以以下请求为例:

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