【问题标题】:HttpHeaders::setAcceptLanguageAsLocales makes header lowercaseHttpHeaders::setAcceptLanguageAsLocales 使标题小写
【发布时间】:2022-01-10 12:39:45
【问题描述】:

当我使用 setAcceptLanguageAsLocales 时,标题内容都是小写的

HttpHeaders headers = new HttpHeaders();
headers.setAcceptLanguageAsLocales(List.of(Locale.US, Locale.GERMANY));

结果:

Accept-Language: en-us, de-de

为什么要转成小写?我希望:

Accept-Language: en-US, de-DE

【问题讨论】:

    标签: java spring-boot http-headers locale


    【解决方案1】:

    这就是 Spring Framework 代码的结果。如果你查看HttpHeaderscode,你会发现setAcceptLanguageAsLocales方法的实现如下:

    public void setAcceptLanguageAsLocales(List<Locale> locales) {
      setAcceptLanguage(locales.stream()
          .map(locale -> new Locale.LanguageRange(locale.toLanguageTag()))
          .collect(Collectors.toList()));
    }
    

    重要的部分是转换为Locale.LanguageRange 对象。如果你查看它的代码,你会发现它的LanguageRange(String range, double weight)构造函数是这样实现的:

    public LanguageRange(String range, double weight) {
        if (range == null) {
            throw new NullPointerException();
        }
        if (weight < MIN_WEIGHT || weight > MAX_WEIGHT) {
            throw new IllegalArgumentException("weight=" + weight);
        }
    
        range = range.toLowerCase(Locale.ROOT);
    
        // Do syntax check.
        boolean isIllFormed = false;
        String[] subtags = range.split("-");
        if (isSubtagIllFormed(subtags[0], true)
            || range.endsWith("-")) {
            isIllFormed = true;
        } else {
            for (int i = 1; i < subtags.length; i++) {
                if (isSubtagIllFormed(subtags[i], false)) {
                    isIllFormed = true;
                    break;
                }
            }
        }
        if (isIllFormed) {
            throw new IllegalArgumentException("range=" + range);
        }
    
        this.range = range;
        this.weight = weight;
    }
    

    重要的部分是range = range.toLowerCase(Locale.ROOT); 行,它实际上将提供的locale.toLanguageTag() 中的所有内容转换为小写,因此您观察到了结果。下面的代码模仿 Spring Framework 代码,并将显示结果:

    public class Main {
        public static void main(String[] args) {
            List<Locale> locales = List.of(Locale.US, Locale.GERMANY);
            System.out.println("::::: Original Locales :::::");
            System.out.println(locales);
    
            System.out.println("::::: Language Tags :::::");
            List<Locale.LanguageRange> languages = locales.stream()
                    .map(locale -> {
                        String languageTag = locale.toLanguageTag();
                        System.out.println(languageTag);
    
                        return new Locale.LanguageRange(languageTag);
                    })
                    .collect(Collectors.toList());
            System.out.println("::::: Locales Language Rages :::::");
            System.out.println(languages);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多