URI-havolalari

All lectures for UZ purposes
Daraja, Dars
Mavjud

UriComponents

UriComponentsBuilder URI-shablonlardan o'zgaruvchilarga ega bo'lgan URI-identifikatorlarini yaratishga yordam beradi, quyidagi misolda ko'rsatilganidek:

Java
UriComponents uriComponents = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")  
.queryParam("q", "{q}")  
.encode() 
.build(); 
URI uri = uriComponents.expand("Westin", "123").toUri();  
  1. Statik fabrika metodi URI-shabloni bilan.
  2. URI-komponentlarini qo'shish yoki almashtirish.
  3. URI-shabloni va URI-o'zgaruvchilarni kodlash so'rovi.
  4. UriComponentsni yig'ish.
  5. O'zgaruvchilarni kengaytirib URI olish.
Kotlin
val uriComponents = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")  
.queryParam("q", "{q}")  
.encode() 
.build() 
val uri = uriComponents.expand("Westin", "123").toUri()  
  1. Statik fabrika metodi URI-shabloni bilan.
  2. URI-komponentlarini qo'shish yoki almashtirish.
  3. URI-shabloni va URI-o'zgaruvchilarni kodlash so'rovi.
  4. UriComponentsni yig'ish.
  5. O'zgaruvchilarni kengaytirib URI olish.

Yuqoridagi kodni bir zanjirga birlashtirib buildAndExpand yordamida qisqartirish mumkin, quyidagi misolda ko'rsatilganidek:

Java
URI uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.encode()
.buildAndExpand("Westin", "123")
.toUri();
Kotlin
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:

Java
URI uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}")
.queryParam("q", "{q}")
.build("Westin", "123");
Kotlin
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:

Java
URI uri = UriComponentsBuilder
.fromUriString("https://example.com/hotels/{hotel}?q={q}")
.build("Westin", "123");
Kotlin
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:

Java
// 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);
Kotlin
// 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:

Java
// 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();
Kotlin
// 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:

Java
String baseUrl = "https://example.com";
DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl);
URI uri = uriBuilderFactory.uriString("/hotels/{hotel}")
.queryParam("q", "{q}")
.build("Westin", "123");
Kotlin
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:

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.

";"ni ko'rib chiqamiz, u yo'lda ruxsat berilgan, lekin zaxiralangan qiymatga ega. Birinchi variant ";" ni o'zgaruvchilarda "%3B" ga almashtiradi, lekin URI-shablonida emas. Buning aksiga, ikkinchi variant ";" ni hech qachon almashtirmaydi, chunki u yo'lda ruxsat etilgan belgi hisoblanadi.

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:

Java
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"
Kotlin
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:

Java
URI uri = UriComponentsBuilder.fromPath("/hotel list/{city}")
.queryParam("q", "{q}")
.build("New York", "foo+bar");
Kotlin
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:

Java
URI uri = UriComponentsBuilder.fromUriString("/hotel list/{city}?q={q}")
.build("New York", "foo+bar");
Kotlin
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:

Java
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();
Kotlin
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.

  • NONE Kodlash 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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION