UriComponents
UriComponentsBuilder URI-shablonlardan o'zgaruvchilarga ega bo'lgan URI-identifikatorlarini yaratishga yordam beradi, quyidagi misolda ko'rsatilganidek:
UriComponents uriComponents = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.encode()
.build();
URI uri = uriComponents.expand("Westin", "123").toUri();
- Statik fabrika metodi URI-shabloni bilan.
- URI-komponentlarini qo'shish yoki almashtirish.
- URI-shabloni va URI-o'zgaruvchilarni kodlash so'rovi.
UriComponentsni yig'ish.- O'zgaruvchilarni kengaytirib
URIolish.
val uriComponents = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.encode()
.build()
val uri = uriComponents.expand("Westin", "123").toUri()
- Statik fabrika metodi URI-shabloni bilan.
- URI-komponentlarini qo'shish yoki almashtirish.
- URI-shabloni va URI-o'zgaruvchilarni kodlash so'rovi.
UriComponentsni yig'ish.- O'zgaruvchilarni kengaytirib
URIolish.
Yuqoridagi kodni bir zanjirga birlashtirib buildAndExpand yordamida qisqartirish mumkin, quyidagi misolda ko'rsatilganidek:
URI uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.encode()
.buildAndExpand("Westin", "123")
.toUri();
val uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.encode()
.buildAndExpand("Westin", "123")
.toUri()
Buni yanada sodda qilish mumkin, URI-identifikatoriga bevosita o'tish orqali (bu kodlashni o'z ichiga oladi), quyidagi misolda ko'rsatilganidek:
URI uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.build("Westin", "123");
val uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.build("Westin", "123")
Buni yanada qisqartirish mumkin, to'liq URI-shabloni yordamida, quyidagi misolda ko'rsatilganidek:
URI uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}?q={q}")
.build("Westin", "123");
val uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}?q={q}")
.build("Westin", "123")
UriBuilder
UriComponentsBuilder UriBuilderni amalga oshiradi. O'z navbatida, UriBuilderni UriBuilderFactory yordamida yaratish mumkin. Birgalikda UriBuilderFactory va UriBuilder umumiy konfiguratsiyaga asoslangan URI-identifikatorlarini yaratish uchun ulanuvchi mexanizmni taqdim etadi, masalan: asosiy URL-manzil, kodlash parametrlari va boshqa tafsilotlar.
RestTemplate va WebClient ni UriBuilderFactory yordamida konfiguratsiya qilish mumkin, URI-identifikatorlarini tayyorlashni sozlash uchun. DefaultUriBuilderFactory - bu UriBuilderFactory ning standart amalga oshirilishi bo'lib, u ichki darajada UriComponentsBuilderdan foydalanadi va umumiy konfiguratsiya parametrlari imkoniyatlarini ochadi.
Quyidagi misolda bunday bean qanday konfiguratsiya qilish ko'rsatilgan:
// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;
String baseUrl = "https://example.org";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setUriTemplateHandler(factory);
// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode
val baseUrl = "https://example.org"
val factory = DefaultUriBuilderFactory(baseUrl)
factory.encodingMode = EncodingMode.TEMPLATE_AND_VALUES
val restTemplate = RestTemplate()
restTemplate.uriTemplateHandler = factory
Quyidagi misolda WebClient konfiguratsiya qilinadi:
// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode;
String baseUrl = "https://example.org";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl);
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
WebClient client = WebClient.builder().uriBuilderFactory(factory).build();
// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode
val baseUrl = "https://example.org"
val factory = DefaultUriBuilderFactory(baseUrl)
factory.encodingMode = EncodingMode.TEMPLATE_AND_VALUES
val client = WebClient.builder().uriBuilderFactory(factory).build()
Bundan tashqari, DefaultUriBuilderFactory ni to'g'ridan-to'g'ri ishlatish mumkin. Bu UriComponentsBuilder ni ishlatishga o'xshaydi, lekin statik fabrika metodlari o'rniga, bu haqiqiy namuna bo'lib, u konfiguratsiya va parametrlarni saqlaydi, quyidagi misolda ko’rsatilganidek:
String baseUrl = "https://example.com";
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl);
URI uri = uriBuilderFactory.uriString("/hotels/{hotel}")
.queryParam("q", "{q}")
.build("Westin", "123");
val baseUrl = "https://example.com"
val uriBuilderFactory = DefaultUriBuilderFactory(baseUrl)
val uri = uriBuilderFactory.uriString("/hotels/{hotel}")
.queryParam("q", "{q}")
.build("Westin", "123")
URI Kodlash
UriComponentsBuilder kodlash imkoniyatlarini ikki darajada ochadi:
-
UriComponentsBuilder#encode(): Avval URI-shablonni oldindan kodlaydi, so'ngra URI-o'zgaruvchilarni kengaytirish paytida qat'iy kodlaydi.
-
UriComponents#encode(): URI-komponentlarini kodlaydi keyin URI-o'zgaruvchilar kengaytirilganidan so'ng.
Har ikkala variant ASCII dan bo'lmagan belgilarni va notog'ri belgilarni oktetlar bilan almashtiradi. Biroq, birinchi variant o'zgaruvchilarda ko'rinadigan zaxiralangan qiymatga ega belgilarni ham almashtiradi.
Ko'p hollarda, birinchi variant kutilgan natijani beradi, chunki bu URI-o'zgaruvchilarni to'liq kodlanishi kerak bo'lgan noaniq ma'lumotlar sifatida qabul qiladi, ikkinchi variant esa zaxiralangan belgilarni ataylab o'z ichiga olgan URI-o'zgaruvchilar mavjud bo'lganda foydalidir. Ikkinchi variant, agar umuman URI-o'zgaruvchilar kengaytirilmasa ham ishlaydi, chunki bu holatda URI-o'zgaruvchiga o'xshash narsalarni kodlaydi.
Quyidagi misolda birinchi variant ishlatiladi:
URI uri = UriComponentsBuilder.fromPath("/hotel list/{city}")
.queryParam("q", "{q}")
.encode()
.buildAndExpand("New York", "foo+bar")
.toUri();
// Natija "/hotel%20list/New%20York?q=foo%2Bbar"
val uri = UriComponentsBuilder.fromPath("/hotel list/{city}")
.queryParam("q", "{q}")
.encode()
.buildAndExpand("New York", "foo+bar")
.toUri()
// Natija "/hotel%20list/New%20York?q=foo%2Bbar"
Yuqoridagi kodni bevosita URI-identifikatoriga o'tish orqali qisqartirish mumkin (bu kodlashni o'z ichiga oladi), quyidagi misolda ko'rsatilganidek:
URI uri = UriComponentsBuilder.fromPath("/hotel list/{city}")
.queryParam("q", "{q}")
.build("New York", "foo+bar");
val uri = UriComponentsBuilder.fromPath("/hotel list/{city}")
.queryParam("q", "{q}")
.build("New York", "foo+bar")
Buni yanada qisqartirish mumkin, to'liq URI-shabloni yordamida, quyidagi misolda ko'rsatilganidek:
URI uri = UriComponentsBuilder.fromUriString("/hotel list/{city}?q={q}")
.build("New York", "foo+bar");
val uri = UriComponentsBuilder.fromUriString("/hotel list/{city}?q={q}")
.build("New York", "foo+bar")
WebClient va RestTemplate URI-shablonlarini kengaytiradi va kodlaydi ichki darajada UriBuilderFactory strategiyasi yordamida. Har ikkala variant ham custom strategiya yordamida konfiguratsiya qilinishi mumkin, quyidagi misolda ko'rsatilganidek:
String baseUrl = "https://example.com";
DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl)
factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES);
// RestTemplate ni sozlaymiz...
RestTemplate restTemplate = new RestTemplate();
restTemplate.setUriTemplateHandler(factory);
// WebClient ni sozlaymiz...
WebClient client = WebClient.builder().uriBuilderFactory(factory).build();
val baseUrl = "https://example.com"
val factory = DefaultUriBuilderFactory(baseUrl).apply {
encodingMode = EncodingMode.TEMPLATE_AND_VALUES
}
// RestTemplate ni sozlaymiz...
val restTemplate = RestTemplate().apply {
uriTemplateHandler = factory
}
// WebClient ni sozlaymiz...
val client = WebClient.builder().uriBuilderFactory(factory).build()
DefaultUriBuilderFactory amalga oshirilishi UriComponentsBuilder dan foydalanadi ichki darajada URI-shablonlarni kengaytirish va kodlash uchun. Fabrika sifatida u kodlash yondashuvini konfiguratsiya qiluvchi yagona joyni taqdim etadi, quyidagi kodlash rejimlaridan biriga asoslangan:
-
TEMPLATE_AND_VALUES: UriComponentsBuilder#encode()ni ishlatadi, yuqoridagi ro'yxatdagi birinchi variantga mos keladigan, URI-shablonni oldindan kodlash va kengaytirish paytida o'zgaruvchilarni qat'iy kodlash uchun. -
VALUES_ONLY: URI-shablonni kodlamaydi va uning o'rniga URI-identifikatorlarning o'zgaruvchilarini UriUtils#encodeUriVariables orqali qat'iy kodlash qo'llanadi, ularni shablonga kengaytirishdan oldin. -
URI_COMPONENT:UriComponents#encode()ni ishlatadi, yuqoridagi ro'yxatdagi ikkinchi variantga mos keladigan, URI-o'zgaruvchilar kengaytirilganidan keyin URI-komponent qiymatini kodlash uchun. -
NONEKodlash qo'llanilmaydi.
RestTemplate tarixiy sabablarga ko'ra va ortga moslik uchun EncodingMode.URI_COMPONENT ga o'rnatilgan. WebClient DefaultUriBuilderFactory dagi standart qiymatga murojaat qiladi, bu 5.0.x dan EncodingMode.URI_COMPONENT dan 5.1 da EncodingMode.TEMPLATE_AND_VALUES ga o'zgartirilgan.
GO TO FULL VERSION