হেটিওএএস ব্যবহার করে একটি রেস্টস্টুল ওয়েব সার্ভিস ডিজাইনের ক্ষেত্রে সম্পূর্ণ ইউআরএল (" http: // সার্ভার: পোর্ট / অ্যাপ্লিকেশন / গ্রাহক / 1234 ") বনাম কেবল পথ ("/ অ্যাপ্লিকেশন / গ্রাহক / 1234 ")?
হেটিওএএস ব্যবহার করে একটি রেস্টস্টুল ওয়েব সার্ভিস ডিজাইনের ক্ষেত্রে সম্পূর্ণ ইউআরএল (" http: // সার্ভার: পোর্ট / অ্যাপ্লিকেশন / গ্রাহক / 1234 ") বনাম কেবল পথ ("/ অ্যাপ্লিকেশন / গ্রাহক / 1234 ")?
উত্তর:
লোকেরা যখন "আপেক্ষিক ইউআরআই" বলে তখন একটি সূক্ষ্ম ধারণাগত অস্পষ্টতা থাকে।
দ্বারা RFC3986 সংজ্ঞা , একটি জেনেরিক কোনো URI রয়েছে:
URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
/ path-absolute
/ path-rootless
/ path-empty
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
কৌতূহলোদ্দীপক বিষয় হ'ল, যখন পরিকল্পনা এবং কর্তৃত্ব বাদ দেওয়া হয়, "পথ" অংশটি নিজেই হয় পরম পাথ (শুরু হয় /
) বা "মূলবিহীন" আপেক্ষিক পথ হতে পারে। উদাহরণ:
"http://example.com:8042/over/there?name=ferret"
/over/there
here
বা ./here
বা ../here
বা ইত্যাদি withসুতরাং, যদি প্রশ্নটি ছিল "কোনও সার্ভার বিশ্রামের প্রতিক্রিয়াতে আপেক্ষিক পথ তৈরি করে কিনা ", উত্তরটি "না" এবং বিশদ কারণ এখানে পাওয়া যায় । আমি মনে করি "আপেক্ষিক ইউআরআই" এর বিপরীতে বেশিরভাগ লোক (আমাকে অন্তর্ভুক্ত করুন) আসলে "আপেক্ষিক পথ" এর বিরুদ্ধে against
ও অনুশীলন, অধিকাংশ সার্ভার সাইড MVC ফ্রেমওয়ার্ক সহজে তৈরি করতে পারেন আপেক্ষিক কোনো URI পথটি সঙ্গে যেমন /absolute/path/to/the/controller
, এবং প্রশ্ন হয়ে "কিনা সার্ভার বাস্তবায়নের একটি উপসর্গ উচিত scheme://hostname:port
সুনির্দিষ্ট পাথ সামনে"। ওপি-র প্রশ্নের মতোই। আমি এই সম্পর্কে পুরোপুরি নিশ্চিত নই।
একদিকে, আমি এখনও মনে করি যে পুরো ইউরি ফিরিয়ে দেওয়ার সার্ভারটি দেওয়া উচিত। তবে সার্ভারের উত্স কোডের অভ্যন্তরীণ জিনিসটিকে কখনই হার্ডকোড করাhostname:port
উচিত নয় (অন্যথায় আমি বরং পরম পাথের সাথে আপেক্ষিক ইউরির কাছে ফ্যালব্যাক করব)। সমাধানটি সর্বদা এইচটিটিপি অনুরোধের "হোস্ট" শিরোনাম থেকে এই উপসর্গটি প্রাপ্ত সার্ভার-সাইড। যদিও এটি প্রতিটি পরিস্থিতিতে কাজ করে কিনা তা নিশ্চিত নয়।
অন্যদিকে, ক্লায়েন্টের পক্ষে http://example.com:8042
এবং পরম পথটিকে একত্রিত করা খুব ঝামেলা বলে মনে হচ্ছে না । সর্বোপরি, ক্লায়েন্টটি ইতিমধ্যে সেই স্কিম এবং ডোমেন নামটি জানে যখন এটি সার্ভারে অনুরোধটি ডানে?
সব মিলিয়ে আমি বলব, নিখুঁত ইউআরআই ব্যবহার করার পরামর্শ দিন, সম্ভবত নিখুঁত পাথের সাথে সম্পর্কিত ইউআরআইয়ের ফ্যালব্যাক, কখনও আপেক্ষিক পথ ব্যবহার করবেন না ।
কে ক্লায়েন্ট কোড লিখছে তার উপর নির্ভর করে। আপনি যদি ক্লায়েন্ট এবং সার্ভার লিখতে থাকেন তবে এতে খুব বেশি পার্থক্য হয় না। আপনি হয় ক্লায়েন্টে বা সার্ভারে ইউআরএল তৈরির ব্যথা ভোগ করবেন।
তবে, আপনি যদি সার্ভারটি তৈরি করছেন এবং আপনি যদি লোকেদের ক্লায়েন্ট কোড লেখার প্রত্যাশা করেন তবে আপনি সম্পূর্ণ ইউআরআই সরবরাহ করলে তারা আপনাকে আরও বেশি ভালবাসবে। আপেক্ষিক ইউআরআই সমাধান করা কিছুটা জটিল হতে পারে। প্রথমে আপনি কীভাবে এগুলি সমাধান করবেন তা মিডিয়া-টাইপ প্রত্যাবর্তনের উপর নির্ভর করে। এইচটিএমএলের বেস ট্যাগ রয়েছে, এক্সএমএলটিতে এক্সএমএল থাকতে পারে: প্রতিটি নেস্টেড উপাদানগুলিতে বেস ট্যাগ থাকতে পারে, অ্যাটম ফিডের ফিডে একটি বেস থাকতে পারে এবং সামগ্রীতে আলাদা বেস থাকতে পারে। আপনি যদি আপনার ক্লায়েন্টকে বেস ইউআরআই সম্পর্কে সুস্পষ্ট তথ্য সরবরাহ না করেন তবে তাদের অনুরোধ ইউআরআই থেকে বা সম্ভবত সামগ্রী-অবস্থানের শিরোনাম থেকে বেস ইউআরআই পেতে হবে! এবং এই পিছনে স্ল্যাশ জন্য সতর্কতা অবলম্বন। বেস ইউআরআই শেষ স্ল্যাশের ডানদিকে সমস্ত অক্ষর উপেক্ষা করে নির্ধারিত হয়। এর অর্থ হ'ল আপেক্ষিক ইউআরআই সমাধান করার সময় পিছনে স্ল্যাশ এখন অত্যন্ত তাৎপর্যপূর্ণ।
কেবলমাত্র অন্য ইস্যুতে যেটির উল্লেখ করার প্রয়োজন নেই তা হ'ল ডকুমেন্ট আকার। আপনি যদি আইটেমগুলির একটি বৃহত তালিকা ফিরিয়ে দিচ্ছেন যেখানে প্রতিটি আইটেমের একাধিক লিঙ্ক থাকতে পারে, পরম ইউআরএলগুলি ব্যবহার করে আপনি সত্তাকে সংকুচিত না করলে আপনার সত্তায় উল্লেখযোগ্য পরিমাণে বাইট যুক্ত করতে পারে। এটি একটি পারফেক্ট ইস্যু এবং কেস ভিত্তিতে এটি কোনও ক্ষেত্রে তাত্পর্যপূর্ণ কিনা তা আপনাকে সিদ্ধান্ত নিতে হবে।
কেবল আসল পার্থক্যটি মনে হয় ক্লায়েন্টদের পক্ষে আপেক্ষিক সংস্করণ থেকে এটি নির্মাণের পরিবর্তে নিখুঁত ইউআরআই খাওয়া হয়। অবশ্যই, পার্থক্যটি আমাকে পরম সংস্করণে চালিত করার পক্ষে যথেষ্ট হবে।
আপনার অ্যাপ্লিকেশন স্কেল হিসাবে, আপনি লোড ব্যালেন্সিং, ব্যর্থ ওভার ইত্যাদি করতে চাইতে পারেন যদি আপনি নিখুঁত ইউআরআই ফিরিয়ে দেন তবে আপনার ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনগুলি আপনার সার্ভারগুলির ক্রমবর্ধমান কনফিগারেশনটি অনুসরণ করবে।
/xxx/yyy...
) হিসাবে সংজ্ঞায়িত করেছেন এবং পুরোপুরি যোগ্য ইউআরআই অর্থ (উদাহরণ ) হিসাবে নয় http://api.example.com/xxx/yyy...
।
রায়লোর ট্রাইকোটমি ব্যবহার করে আমার সংস্থা অনুকূল (2) পছন্দ করেছে। প্রাথমিক কারণটি হল এক্সএসএস (ক্রস-সাইট স্ক্রিপ্টিং) আক্রমণ এড়ানো। সমস্যাটি হ'ল, যদি কোনও আক্রমণকারী সার্ভার থেকে ফিরে আসা প্রতিক্রিয়ার জন্য তাদের নিজস্ব ইউআরএল রুট ইনজেকশন করতে পারে তবে পরবর্তী ব্যবহারকারী অনুরোধগুলি (যেমন ব্যবহারকারীর নাম এবং পাসওয়ার্ড সহ একটি প্রমাণীকরণের অনুরোধ) আক্রমণকারীর নিজস্ব সার্ভারে * ফরোয়ার্ড করা যেতে পারে।
কেউ কেউ লোড ব্যালেন্সিংয়ের জন্য অন্যান্য সার্ভারগুলিতে অনুরোধগুলি পুনর্নির্দেশ করতে সক্ষম হবার বিষয়টি তুলে ধরেছে, তবে (যদিও এটি আমার দক্ষতার ক্ষেত্র নয়) আমি ক্লায়েন্টদের আলাদা করে স্পষ্টত পুনঃনির্দেশ না করে লোড ব্যালেন্সিং সক্ষম করার আরও ভাল উপায় থাকতে পারে তা আমি জেগিয়ে তুলব would হোস্ট।
* দয়া করে এই যুক্তির লাইনে কোনও ত্রুটি আছে কিনা তা আমাকে জানান। অবশ্যই লক্ষ্যটি সমস্ত আক্রমণ প্রতিরোধ করা নয়, তবে আক্রমণটির কমপক্ষে একটি উপায়।
আপনার সর্বদা পূর্ণ URL টি ব্যবহার করা উচিত। ইউআরএলগুলির সমস্ত অনন্য হওয়ার প্রয়োজন হওয়ায় এটি সংস্থানটির অনন্য সনাক্তকারী হিসাবে কাজ করে।
আমি তর্ক করব যে আপনার উচিত ধারাবাহিক হওয়া উচিত। যেহেতু অবস্থান HTTP শিরোনাম HTTP নির্দিষ্টকরণের উপর ভিত্তি করে একটি সম্পূর্ণ URL টি প্রত্যাশা করে, তাই কোনও নতুন সংস্থান তৈরি হওয়ার পরে পুরো URLটি ক্লায়েন্টের কাছে লোকেশন শিরোনামে ফিরে পাঠানো হয়। আপনার অবস্থান শিরোনামে পুরো URL এবং তারপরে আপনার প্রতিক্রিয়া শৃঙ্খলে থাকা লিঙ্কগুলিতে আপেক্ষিক ইউআরআই সরবরাহ করা আপনার জন্য আশ্চর্যজনক হবে।
Location
দেয় - একটি পরম ইউআরআই যাতে ইউআরআই স্কিম বা সার্ভারের নেটওয়ার্কের অবস্থান থাকে না। লিঙ্ক এবং আইডি প্রায়শই গুলিয়ে ফেলা হয় তবে তারা একই জিনিস হয় না - প্রাক্তনটির প্রসঙ্গ রয়েছে, তবে এর পরে নেই।
বৃহত এপিআই ফলাফলগুলিতে একটি গুরুত্বপূর্ণ বিবেচনা হ'ল বারবার সম্পূর্ণ ইউআরআই অন্তর্ভুক্ত করার অতিরিক্ত নেটওয়ার্ক ওভারহেড। বিশ্বাস করুন বা না করুন, জিজিপ পুরোপুরি এই সমস্যাটি সমাধান করে না (কেন তা নিশ্চিত নয়)। যখন ফলাফলের মধ্যে কয়েকশ লিঙ্ক অন্তর্ভুক্ত ছিল তখন পুরো ইউআরআই কতটা জায়গা নিয়েছিল তাতে আমরা হতবাক হয়ে গিয়েছিলাম।
পরম ইউআরআই ব্যবহারের একটি অসুবিধা হ'ল এপিআই প্রক্সি করা যায় না।
এটিকে ফিরিয়ে দিন ... সত্য নয়। আপনার ডোমেন সহ একটি সম্পূর্ণ URL এর জন্য যাওয়া উচিত।
উপকারের বিষয়ে, আমি (পরম) পাথের জন্য কোনও ক্লায়েন্টের জন্য প্রয়োজনীয় অতিরিক্ত হ্যান্ডলিংয়ের ব্যয়ে সংক্রমণিত বাইটগুলি হ্রাস দেখছি। আপনি যদি প্রতিটি বাইট সংরক্ষণ করতে মরিয়া হয়ে থাকেন, এমনকি gzip হিসাবে সামগ্রী-এনকোডিং করার পরেও, ক্যাচিং শিরোনামের যথাযথ ব্যবহার, ক্লায়েন্টের উপর etags এবং শর্তসাপেক্ষ অনুরোধগুলি ব্যবহার করার পরে, তবে শেষ পর্যন্ত এটি প্রয়োজনীয় হতে পারে তবে আমি তার থেকে অনেক বেশি প্রত্যাশার প্রত্যাশা করি আপনার প্রচেষ্টা অন্যদিকে।
কনস সম্পর্কে, আমি কীভাবে আপনি ভবিষ্যতে সংস্থাগুলির মধ্যে ক্লায়েন্টদের প্রবাহকে পরিচালনা করতে পারেন সে সম্পর্কে নিয়ন্ত্রণের ক্ষতি দেখতে পাই (ভারসাম্য বজায় রাখা, এ / বি পরীক্ষা, ...), এবং আমি এটি একটি ওয়েব পরিচালনার বিষয়ে একটি খারাপ অভ্যাস হিসাবে বিবেচনা করব এপিআই আপনার সরবরাহ করা ইউআরএলটি আর ক্লায়েন্টের জন্য মূলত অস্বচ্ছ নয় ( ইউআরআই অস্বচ্ছতার উপর টিম বার্নার্স-লি অ্যাক্সিওমস ওয়েব আর্কিটেকচারের দেখুন )। শেষ পর্যন্ত, আপনি কেবল আপনার ইউআরএল স্পেসের কাঠামো সম্পর্কিত হলেও ক্লায়েন্টদের আপনার API এর সৃজনশীল ব্যবহারের বিষয়ে তাদের খুশি রাখতে দায়বদ্ধ হন। আপনার যদি কখনও স্পষ্টভাবে সংজ্ঞায়িত ইউআরএল সংশোধন করার অনুমতি দেওয়ার দরকার হয় তবে হাইপারটেক্সট অ্যাপ্লিকেশন ভাষার ক্ষেত্রে ইউআরআই টেম্পলেটগুলির ব্যবহার বিবেচনা করুন ।