URI ডিপ লিঙ্কগুলি মেলান

প্যাটার্নের সাথে হায়ারারকিক্যাল ইউআরআই মেলানো এবং আর্গুমেন্ট বের করার জন্য UriDeepLinkMatcher ব্যবহার করুন। এটি মিলে যাওয়া আর্গুমেন্টগুলোকে আপনার কী ক্লাসে ডিসিরিয়ালাইজ করার জন্য kotlinx.serialization উপর নির্ভর করে।

একটি UriDeepLinkMatcher তৈরি করতে, DeepLinkUri প্যাটার্ন এবং সংশ্লিষ্ট কী-এর জন্য সিরিয়ালাইজার প্রদান করুন:

অ-ক্রমিক URI বা কাস্টম স্কিমের (যেমন tel: ) জন্য, কাস্টম ডিপ লিঙ্ক ম্যাচিং তৈরি করুন দেখুন।

সমর্থিত মিলের ধরণ

UriDeepLinkMatcher ইউআরআই-এর পাঁচটি উপাদানের (স্কিম, অথরিটি, পাথ, কোয়েরি এবং ফ্র্যাগমেন্ট) উপর ভিত্তি করে সেগুলোকে মেলায়। নিম্নলিখিত বিভাগগুলিতে প্রতিটি উপাদানের জন্য সমর্থিত প্যাটার্ন সিনট্যাক্স, আর্গুমেন্ট প্লেসহোল্ডার এবং মেলানোর নিয়ম বর্ণনা করা হয়েছে।

স্কিম মেলানো

URI প্যাটার্নে কোনো স্কিম উপস্থিত না থাকলে, http এবং https উভয়ই ম্যাচ হয়। একটি নির্দিষ্ট স্কিম ম্যাচ করার জন্য, প্যাটার্নে সেটি অন্তর্ভুক্ত করুন। ব্যতিক্রম হিসেবে, একটি প্যাটার্নে http স্কিম থাকলে তা http এবং https উভয় রিকোয়েস্ট URI-কেই ম্যাচ করে, অপরদিকে একটি প্যাটার্নে https থাকলে তা শুধুমাত্র https রিকোয়েস্টকেই ম্যাচ করে।

প্যাটার্ন ইউআরআই অনুরোধ URI ম্যাচ
www.example.com https://www.example.com
www.example.com http://www.example.com
http://www.example.com http://www.example.com
http://www.example.com https://www.example.com
https://www.example.com http://www.example.com
myapp://www.example.com myapp://www.example.com

কর্তৃত্ব মেলানো

UriDeepLinkMatcher ইউআরআই অথরিটির (হোস্ট এবং ঐচ্ছিক পোর্ট) উপর একটি কেস-ইনসেনসিটিভ এক্সাক্ট ম্যাচ সম্পাদন করে। অথরিটিতে প্লেসহোল্ডার বা ওয়াইল্ডকার্ড সমর্থিত নয়, এবং কোনো আর্গুমেন্ট এক্সট্র্যাক্ট করা হয় না:

প্যাটার্ন ইউআরআই অনুরোধ URI ম্যাচ
example.com https://example.com
example.com https://EXAMPLE.COM
example.com https://sub.example.com
example.com https://www.example.com
example.com https://example.com:8080
example.com:8080 https://example.com:8080
example.com:8080 https://example.com

পথ মেলানো

নিম্নলিখিত পাথ প্যাটার্নগুলি সমর্থিত:

প্যাটার্ন ইউআরআই অনুরোধ URI ম্যাচ নিষ্কাশিত যুক্তি
www.example.com/users https://www.example.com/users কোনোটিই না
www.example.com/users/{id} https://www.example.com/users/123 id : "123"
www.example.com/users/{first}-{last} https://www.example.com/users/john-doe first : "john" , last : "doe"
www.example.com/users/{id}/profile https://www.example.com/users//profile id : "" (খালি স্ট্রিং)
www.example.com/users/user_{id} https://www.example.com/users/user_123 id : "123"
www.example.com/users/{userId}/posts/{postId} https://www.example.com/users/123/posts/456 userId : "123" , postId : "456"
www.example.com/users/.* https://www.example.com/users/john-doe কোনোটিই না
www.example.com/users https://www.example.com/users/ ❌ (শেষের স্ল্যাশ একটি অতিরিক্ত অংশ তৈরি করে) প্রযোজ্য নয়

কোয়েরি মেলানো

রিকোয়েস্ট URI-তে কোয়েরি প্যারামিটারের ক্রম প্যাটার্ন URI-এর ক্রমের সাথে মেলানোর প্রয়োজন নেই। এছাড়াও, যে প্যারামিটারগুলো রিকোয়েস্ট URI-তে উপস্থিত কিন্তু প্যাটার্ন URI-তে নেই, সেগুলো উপেক্ষা করা হয়।

নিম্নলিখিত কোয়েরি প্যারামিটার প্যাটার্নগুলো সমর্থিত:

প্যাটার্ন ইউআরআই অনুরোধ URI নিষ্কাশিত যুক্তি
www.example.com/users?name={name} https://www.example.com/users?name=john name : "john"
www.example.com/users?name={name} https://www.example.com/users?name= name : "" (খালি স্ট্রিং)
www.example.com/users?{rawQuery} https://www.example.com/users?anything&else rawQuery : ["anything", "else"]
www.example.com/users?type=user_{id} https://www.example.com/users?type=user_123 id : "123"
www.example.com/users?name={first}_{last} https://www.example.com/users?name=john_doe first : "john" , last : "doe"
www.example.com/users?list={list} https://www.example.com/users?list=10&list=20 list : ["10", "20"]
www.example.com/users?name={name}&{other} https://www.example.com/users?name=john&tab=info name : "john" , other : ["tab=info"]
www.example.com/users?type=user_.* https://www.example.com/users?type=user_admin type : "admin"

খণ্ডাংশ মেলানো

নিম্নলিখিত ফ্র্যাগমেন্ট প্যাটার্ন প্রকারগুলি সমর্থিত:

প্যাটার্ন ইউআরআই অনুরোধ URI নিষ্কাশিত যুক্তি
www.example.com/#section1 https://www.example.com/#section1 কোনোটিই না
www.example.com/#section_{id} https://www.example.com/#section_123 id : "123"
www.example.com/#section_.* https://www.example.com/#section_123 কোনোটিই না

সমর্থিত ডেটা প্রকার

UriDeepLinkMatcher ইউআরআই আর্গুমেন্টগুলোকে প্রিমিটিভ টাইপ, এনাম, কালেকশন এবং কাস্টম অবজেক্টে ডিসিরিয়ালাইজ করা সমর্থন করে। সিরিয়ালাইজেশন দুটি শ্রেণীতে বিভক্ত:

  • স্ট্যান্ডার্ড সিরিয়ালাইজেশন : kotlinx.serialization ব্যবহার করে নিম্নলিখিত রূপে ডিসিরিয়ালাইজ করে:
    • প্রিমিটিভ ( Boolean , Int , Long , Float , Double , Char , Byte , Short ) এবং String
    • এনাম
    • প্রিমিটিভ, স্ট্রিং বা এনামের Set , List বা Array
    • নেস্টেড @Serializable ক্লাস (যার প্রোপার্টিগুলো স্বতন্ত্র URI প্লেসহোল্ডারে পরিণত হয়)
  • DeepLinkSerializer সাহায্যে কাস্টম সিরিয়ালাইজেশন : একটি একক String এবং কাস্টম অবজেক্ট, এক্সটার্নাল টাইপ (যেমন java.time.LocalDate ), বা কাস্টম-ডিলিমিটেড কালেকশনের মধ্যে রূপান্তর করে।

স্ট্যান্ডার্ড সিরিয়ালাইজেশন

UriDeepLinkMatcher কোনো কাস্টম সিরিয়ালাইজার ইমপ্লিমেন্টেশনের প্রয়োজন ছাড়াই স্ট্যান্ডার্ড টাইপ এবং ফ্ল্যাটেনড স্ট্রাকচারের জন্য সরাসরি কাজ করে।

প্রিমিটিভ এবং স্ট্রিং

UriDeepLinkMatcher স্বয়ংক্রিয়ভাবে প্রিমিটিভ টাইপ ( Boolean , Int , Long , Float , Double , Char , Byte , Short ) এবং String ডিকোড করে:

এনাম

Enum এলিমেন্টের নামগুলোর সাথে Enum ভ্যালুগুলো কেস-সেনসিটিভভাবে মেলানো হয়:

পুনরাবৃত্ত কোয়েরি সংগ্রহ

পুনরাবৃত্ত কী-সহ কোয়েরি প্যারামিটার (যেমন ?id=10&id=20 ) স্বয়ংক্রিয়ভাবে List<T> , Set<T> , বা Array<T> তে ডিসিরিয়ালাইজ হয়, যেখানে T হলো একটি প্রিমিটিভ টাইপ, String , বা enum।

নেস্টেড @Serializable ক্লাস

যখন কোনো NavKey এমন কোনো প্রপার্টি থাকে যার টাইপ অন্য একটি @Serializable ক্লাস, তখন UriDeepLinkMatcher তার প্রপার্টিগুলোকে ফ্ল্যাটেন করে, ফলে নেস্টেড ক্লাসের প্রতিটি প্রপার্টি সরাসরি একই নামের একটি স্বতন্ত্র URI প্যারামিটারের সাথে ম্যাপ হয়:

কাস্টম অবজেক্ট (যেমন Filter(key = "brand", value = "pixel") ), এক্সটার্নাল টাইপ (যেমন java.time.LocalDate ), বা কাস্টম ডিলিমিটেড স্ট্রিং (যেমন কমা-বিভক্ত মান) ডিসিরিয়ালাইজ করতে, DeepLinkSerializer<T> এক্সটেন্ড করুন।

DeepLinkSerializer<T> হলো একটি অ্যাবস্ট্রাক্ট KSerializer<T> যা একটি String এবং T মধ্যে রূপান্তর করে:

abstract class DeepLinkSerializer<T : Any> : KSerializer<T> {
    abstract val serialName: String
    abstract fun deserialize(value: String): T
    abstract fun serialize(value: T): String
}

উদাহরণস্বরূপ, নিম্নলিখিত কোড স্নিপেটগুলিতে ব্যবহৃত Filter এবং FilterSerializer সংজ্ঞাগুলি বিবেচনা করুন:

একক কাস্টম বস্তু

একটিমাত্র URI প্যারামিটার স্ট্রিং (যেমন ?filter=brand:google ) থেকে কোনো অবজেক্ট ডিকোড করতে, প্রপার্টিটিকে @Serializable(with = ...) দিয়ে অ্যানোটেট করুন:

পুনরাবৃত্ত কোয়েরি প্যারামিটারে কাস্টম অবজেক্ট

পুনরাবৃত্ত কোয়েরি প্যারামিটারগুলোকে কাস্টম অবজেক্টের ( List<T> , Set<T> , বা Array<T> ) একটি সংগ্রহে ডিসিরিয়ালাইজ করতে, এলিমেন্ট টাইপ T এর জন্য DeepLinkSerializer<T> ইমপ্লিমেন্ট করুন এবং প্রপার্টির টাইপ আর্গুমেন্টটিকে @Serializable(with = ...) দিয়ে অ্যানোটেট করুন:

একক প্যারামিটারে সীমাবদ্ধ সংগ্রহ

কমা দ্বারা পৃথক করা বা কাস্টম-ডিলিমিটেড ভ্যালু (যেমন ?ids=1,2,3 ) একটি কালেকশনে পার্স করতে, সম্পূর্ণ কালেকশন টাইপের জন্য DeepLinkSerializer ইমপ্লিমেন্ট করুন এবং প্রপার্টিটিকে @Serializable(with = ...) দিয়ে অ্যানোটেট করুন:

যুক্তির বৈধতা এবং মিলের ফলাফল

UriDeepLinkMatcher অমিল ( null রিটার্ন করে যাতে অন্যান্য ম্যাচিং টুল চেষ্টা করা যায়) এবং অসমর্থিত কনফিগারেশনের (একটি এক্সেপশন থ্রো করে) মধ্যে পার্থক্য করতে পারে।

অমিল

যখন আগত অনুরোধের URI প্যাটার্ন বা প্রকারের প্রয়োজনীয়তা পূরণ করে না, তখন একটি অমিল ঘটে:

  • প্রয়োজনীয় প্যারামিটার অনুপস্থিত : ডিফল্ট মানবিহীন নন-নাল কী প্রপার্টি, যার সংশ্লিষ্ট URI প্যারামিটারগুলো রিকোয়েস্ট URI-তে অনুপস্থিত।
  • টাইপ পার্সিং ব্যর্থতা : নিষ্কাশিত আর্গুমেন্ট মান যা প্রত্যাশিত প্রপার্টি টাইপে পার্স করা যায় না (উদাহরণস্বরূপ, একটি Int প্রপার্টির জন্য "abc" )।

যখন কোনো অমিল ঘটে, UriDeepLinkMatcher.match null রিটার্ন করে, যার ফলে পরবর্তী ম্যাচিং ফাংশনগুলো মূল্যায়ন করা যায়।

ডিফল্ট মান, নেস্টেড অবজেক্ট এবং এনাম দিয়ে কনফিগার করা একটি কী ক্লাস ও ম্যাচারের কথা বিবেচনা করুন:

নিম্নলিখিত সারণিতে বিভিন্ন অনুরোধ URI-এর জন্য মিলযুক্ত ফলাফল দেখানো হয়েছে:

অনুরোধ URI ডিকোডিং ফলাফল ম্যাচের ফলাফল
https://www.example.com/map/paris?zoom=15&style=dark&layer=SATELLITE সফল (সমস্ত প্যারামিটার সরবরাহ করা হয়েছে) UriMatchResult(MapKey("paris", 15, LayerOptions("dark", MapLayer.SATELLITE)))
https://www.example.com/map/paris?style=dark সফল ( zoom ডিফল্ট 12 , layer STANDARD ) UriMatchResult(MapKey("paris", 12, LayerOptions("dark", MapLayer.STANDARD)))
https://www.example.com/map/paris?zoom=&style=dark সফল (খালি ঐচ্ছিক কোয়েরি প্যারামিটার ডিফল্ট 12 ব্যবহার করে) UriMatchResult(MapKey("paris", 12, LayerOptions("dark", MapLayer.STANDARD)))
https://www.example.com/map?style=dark অমিল (প্রয়োজনীয় location প্যারামিটার অনুপস্থিত) null
https://www.example.com/map/paris?zoom=close&style=dark অমিল ( "close" একটি Int নয় ) null
https://www.example.com/map/paris?style=dark&layer=HYBRID অমিল ( "HYBRID" enum-এ নেই) null

অসমর্থিত কনফিগারেশন

আপনার কী ক্লাসে যদি অসমর্থিত ডেটা টাইপ থাকে, তাহলে UriDeepLinkMatcher ম্যাচিং করার সময় null রিটার্ন করার পরিবর্তে একটি এক্সেপশন থ্রো করে।

  • ম্যাপ এবং বহুমাত্রিক কালেকশন : UriDeepLinkMatcher শুধুমাত্র DeepLinkSerializer দিয়ে অ্যানোটেট করা প্রিমিটিভ, স্ট্রিং, এনাম বা কাস্টম টাইপের একমাত্রিক কালেকশন সমর্থন করে। Map টাইপ IllegalArgumentException থ্রো করে, অন্যদিকে নেস্টেড কালেকশন (যেমন List<List<String>> ) SerializationException থ্রো করে।
  • টীকা ছাড়া কাস্টম অবজেক্ট কালেকশন : কাস্টম টাইপের কালেকশন (যেমন List<Filter> ) একটি SerializationException থ্রো করে, যদি না এলিমেন্ট টাইপটি DeepLinkSerializer দিয়ে টীকাযুক্ত থাকে।
  • আনফ্ল্যাটেনড নেস্টেড ক্লাস : DeepLinkSerializer ছাড়া নেস্টেড @Serializable ক্লাসগুলোকে কোনো একটিমাত্র প্লেসহোল্ডারে (যেমন ?user={user} ) ম্যাপ করা যায় না।

UriMatchResult তুলনা

UriMatchResult ইনস্ট্যান্সগুলোকে নিম্নলিখিত মানদণ্ড অনুসারে ক্রমানুসারে র‍্যাঙ্ক করা হয়:

  1. MatchResult টাইপ : UriMatchResult অন্যান্য MatchResult টাইপের চেয়ে উচ্চতর র‍্যাঙ্কে রয়েছে।
  2. সঠিক পথ : আক্ষরিক পথের মিলগুলো প্লেসহোল্ডার বা ওয়াইল্ডকার্ড মিলের চেয়ে উচ্চতর র‍্যাঙ্ক পায়।
  3. পাথ আর্গুমেন্টের সংখ্যা : যেগুলোর পাথ আর্গুমেন্টের সংখ্যা বেশি, সেগুলোর র‍্যাঙ্ক উচ্চতর হয়।
  4. আর্গুমেন্টের উপস্থিতি : যে ম্যাচগুলোতে আর্গুমেন্ট থাকে, সেগুলোর র‍্যাঙ্ক আর্গুমেন্ট না থাকা ম্যাচগুলোর চেয়ে বেশি হয়।
  5. মোট আর্গুমেন্ট সংখ্যা : আর্গুমেন্টগুলোর (পাথ, কোয়েরি, ফ্র্যাগমেন্ট) মোট সংখ্যাই চূড়ান্ত নির্ণায়ক।

UriDeepLinkMatcher কাস্টমাইজ করুন

UriDeepLinkMatcher একটি open ক্লাস যা থেকে সাবক্লাস তৈরি করে আপনি URI ম্যাচিং এবং আর্গুমেন্ট এক্সট্র্যাকশনের আচরণ কাস্টমাইজ করতে পারেন:

  • matchRequest : আগত DeepLinkRequest জন্য শীর্ষ-স্তরের ম্যাচিং এন্ট্রি পয়েন্ট। URI ম্যাচিংয়ের আগে রিকোয়েস্ট এক্সট্রাগুলো পরীক্ষা করতে বা কাস্টম পূর্বশর্ত প্রয়োগ করতে এটি ওভাররাইড করুন।
  • matchUri : কনফিগার করা প্যাটার্নের সাথে DeepLinkUri কে মেলায়। super.matchUri কল করার আগে আগত URI-গুলিকে ইন্টারসেপ্ট ও স্বাভাবিক করার জন্য (উদাহরণস্বরূপ, ডাইনামিক সাবডোমেইন বা পুরোনো পাথ ফরম্যাট পুনর্লিখন) এটি ওভাররাইড করুন।
  • matchArguments : প্রদত্ত serializer ব্যবহার করে নিষ্কাশিত পাথ, কোয়েরি, এবং ফ্র্যাগমেন্ট আর্গুমেন্ট ম্যাপগুলোকে একটি নেভিগেশন কী ইনস্ট্যান্সে ডিসিরিয়ালাইজ করে। কী ইনস্ট্যানসিয়েশনের আগে ডাইনামিক ভ্যালু ইনজেক্ট করতে বা আর্গুমেন্ট ট্রান্সফর্ম করতে এটি ওভাররাইড করুন।

নিম্নলিখিত উদাহরণটি ম্যাচিং করার আগে লিগ্যাসি ইউআরএল পাথ প্রিফিক্সগুলোকে স্বাভাবিক করার জন্য UriDeepLinkMatcher সাবক্লাস করার পদ্ধতি প্রদর্শন করে: