2013-03-12 10 views
6

प्रत्येक वेब एप्लिकेशन - प्रत्येक वेबसाइट - एक सेवा है। (...) ऐसी विशेषताएं जो वेब सर्फर का उपयोग करने के लिए वेब साइट को आसान बनाती हैं, वे भी प्रोग्रामर के लिए एक वेब सेवा एपीआई आसान बनाती हैं।क्या वेबसाइट भी वेब संसाधन होनी चाहिए?

रिचर्डसन और रूबी, "RESTful वेब सेवाओं"

मैं इसे इरादा के रूप में, एक वेब साइट है कि यह भी एक वेब सेवा अपने संसाधनों का अधिक प्रतिनिधित्व प्रदान करता है, क्या उपयोगकर्ता के एजेंट के आधार पर अनुरोध। एपीआई, बोलने के लिए, वेब साइट ही है, और अलग से प्रदान नहीं की जाती है।

जंगली में कई लोकप्रिय "आरईएसटी एपीआई" के लिए यह मामला नहीं है। उदाहरण के लिए, ट्विटर का एपीआई http://api.twitter.com/1/ पर स्थित है, यूआरआई में '1' एपीआई का संस्करण है। सोशलकास्ट https://demo.socialcast.com/api/ पर एक आरईएसटी एपीआई भी प्रदान करता है, तीसरा स्तर का नाम उस नेटवर्क का नाम है जो इसे संबोधित करता है।

यह मेरे लिए गलत लगता है। अगर मेरे पास http://www.example.com/blog पर मेरा ब्लॉग है, तो मुझे केवल एक अलग स्थान पर एपीआई प्रदान करने की आवश्यकता नहीं है, केवल रोबोट के लिए JSON की सेवा करना। http://www.example.com/blog/posts/ और http://api.example.com/blog/posts, दो अलग-अलग यूआरआई होने के बजाय, मेरे पास केवल पूर्व, और एकाधिक प्रस्तुतियां उपलब्ध होनी चाहिए, जिनमें से JS12 API के लिए application/json है, जो मैं अपने उपयोगकर्ताओं को प्रदान करना चाहता हूं।

उदाहरण 1: एक ब्राउज़र अपने ब्लॉग पर पोस्ट के लिए पूछ रहा;

अनुरोध:

curl -i \ 
-H "Accept: text/html" \ 
-X GET \ 
http://www.example.org/blog/posts/ 

प्रतिक्रिया:

200 OK 
Content-Type: text/html; charset=utf-8 

<html><body><h1>Posts</h1><ol><li><h2>My first post ... 

उदाहरण 2: उसी URI, लेकिन इस बार एक रोबोट अनुरोध करता है;

अनुरोध:

curl -i \ 
-H "Accept: application/json" \ 
-X GET \ 
http://www.example.org/blog/posts/ 

प्रतिक्रिया: एपीआई के लिए

200 OK 
Content-Type: text/html; charset=utf-8 

{ 
    "posts": [ 
     { 
      "id": 1, 
      "title": "My first post" ... 

संस्करण संख्या अनुरोध हेडर की "स्वीकार" क्षेत्र में एन्कोड किया जाना चाहिए, और से बचने के सब से ऊपर दृढ़ता से टाइपिंग ट्विटर जैसे यूआरआई ("स्थिति/show.json? id = 210462857140252672" या "स्थिति/शो/210462857140252672.json") करते हैं।

मैं एकीकृत दृष्टिकोण के लिए जाकर कुछ लचीलापन खो सकता हूं (लेकिन, Cool URIs never change? नहीं होना चाहिए), लेकिन मुझे लगता है कि आरईएसटी (या कम से कम मेरी व्याख्या) का पालन करने से अधिक लाभ मिलेगा।

कौन सा सही दृष्टिकोण है: एपीआई और वेबसाइट को अलग करना, या उन्हें एकीकृत करना?

उत्तर

7

यहां कोई अधिकार या गलत नहीं है। आरईएसटी और आरएफसी के बाद बहुत मुश्किल साबित हो सकती है जब आपका एपीआई विकास विशिष्ट ग्राहक आवश्यकताओं द्वारा संचालित होता है।

असल में, मानव उपयोगकर्ताओं के पास एपीआई क्लाइंट की तुलना में अलग-अलग व्यवहार पैटर्न होते हैं, और इसलिए विभिन्न उपचार की आवश्यकता होती है। सबसे ज्वलंत भेद इस तथ्य से आता है कि कई एपीआई बैच ऑपरेशंस और डेटा डंपिंग के लिए डिज़ाइन किए गए बहुत डेटा गहन हैं, जबकि मानव उपयोगकर्ताओं के लिए आवेदन अधिक "प्रतिक्रियाशील" होते हैं और अक्सर कदम-दर-चरण, अनुरोध-दर-अनुरोध करते हैं। नतीजतन, कई परियोजनाओं में एपीआई यूआरएल डिज़ाइन कई नेटवर्क राउंडट्रिप्स पर क्लाइंट और सर्वर संसाधनों को बर्बाद करने और स्टोरेज कॉल दोहराने से बचने के लिए अनुकूलित है।

हुड के तहत, एपीआई कार्यान्वयन में अक्सर कोर एप्लिकेशन से अलग डिज़ाइन होता है, जो ऑपरेशन एपीआई प्रदान करने के लिए अनुकूलित होता है। उदाहरण के लिए, एपीआई कार्यान्वयन एक अलग कैशिंग रणनीति का उपयोग कर सकते हैं। अब अगर आप कोड को विभाजित करते हैं, तो आप मेजबानों का समूह बनाना चाहते हैं जो केवल एपीआई कॉल को संभालते हैं। यही वह जगह है जहां किसी अन्य डोमेन पर एपीआई रखना लोड प्रबंधन के लिए फायदेमंद हो जाता है: एक अलग डोमेन उच्च लोड साइटों पर सरल लोड संतुलन के लिए अनुमति देता है। तुलनात्मक रूप से, जब आप उसी डोमेन नाम पर/एपीआई यूआरएल उपसर्ग का उपयोग करते हैं (लेकिन अलग क्लस्टर हैं) तो आपको एपीआई और वेब फ्रंट एंड क्लस्टर के बीच अनुरोध प्रवाह को विभाजित करने का काम करने के लिए एक स्मार्ट (एल 7-जागरूक) लोड बैलेंसर की आवश्यकता होती है, लेकिन ऐसे लोड बैलेंसर्स अधिक महंगी हैं।

तो बहुत अच्छे तकनीकी कारण हो सकते हैं कि ट्विटर की पसंद एपीआई को अलग क्यों करती है, लेकिन अन्य कार्यान्वयन के संदर्भ आपके प्रोजेक्ट पर लागू नहीं हो सकते हैं। यदि आप डिज़ाइन के शुरुआती चरणों में हैं, तो आप एक ही डोमेन पर एक एकीकृत यूआरएल योजना शुरू करना चाहेंगे, लेकिन आखिर में आप पाएंगे कि वास्तविक वास्तविक जीवन के मामले हैं जो आपको दृष्टिकोण बदलते हैं, और फिर ... रिफैक्टरिंग।

पीएस यहां संस्करण पर एक लंबी चर्चा है - Best practices for API versioning?

पीएसएस मुझे दृढ़ता से टाइप किए गए यूआरएल त्वरित डिबगिंग में सहायक पाते हैं। आप बस .zson के साथ ब्राउज़र में एक यूआरएल डाल सकते हैं और कमांड लाइन पर स्विच किए बिना तुरंत परिणाम प्राप्त कर सकते हैं।लेकिन आपसे सहमत हैं कि "स्वीकार करें" हेडर पसंदीदा विधि

पीएसएसएस एपीआई के लिए एसईओ? मैं देख सकता हूं कि एक अच्छा यूआरएल डिज़ाइन लाभकारी कैसे हो सकता है, लेकिन एक खोज इंजन के लिए शायद यह अप्रासंगिक है यदि आपकी सेवा एक ही पथ/डोमेन नाम पर एकाधिक आउटपुट स्वरूप प्रदान करती है। दिन के अंत में, खोज इंजन मानव उपयोगकर्ताओं के लिए बनाए जाते हैं, और मानव उपयोगकर्ता एक्सएमएल और जेएसओएन का उपभोग नहीं करते हैं।

2

वेब और एक विश्वसनीय API विभिन्न तरीकों से व्यवहार कर सकता है।

सिद्धांत रूप में, http://mysite.com/blog/1 जैसे अनुरोध को एक HTML पृष्ठ या केवल डेटा (JSON, XML ...) वापस करने की आवश्यकता है तो अलग-अलग कैसे होगा?

Accept: text/html <-- Web browsers 
Accept: application/json <-- Applications/Relying parties consuming data or performing actions 

क्यों ट्विटर, फेसबुक या अन्य साइटों दोनों वेब ब्राउज़र और भरोसा दलों मिश्रित नहीं होते हैं: मैं AcceptHTTP हेडर का उपयोग कर के लिए मतदान करेंगे? ईमानदारी से मैं तर्क दूंगा कि यह एक मनमाना निर्णय है।

शायद मैं एक संभावित कारण प्रदान कर सकता हूं: वेब ब्राउजर/सर्च इंजन रोबोट यूआरएल अनुकूल यूआरएल होना चाहिए क्योंकि यह एसईओ पर बेहतर काम करता है। इसी कारण से, शायद एसईओ तैयार यूआरएल आरईएसटी के मामले में बहुत अर्थपूर्ण नहीं हैं, लेकिन वे खोज इंजन या यहां तक ​​कि मानव उपयोगकर्ताओं के लिए भी हैं!

अंत में: कौन सा बेहतर है (यह मेरी राय है)?

  • आप एसईओ की जरूरत है, तो अलग-अलग URL का उपयोग करें।
  • आपको एसईओ, की आवश्यकता नहीं है, तो उसी डोमेन में यूआरएल को एकजुट करें और प्रारूपित करें।
+3

कस्टम हेडर क्यों? यही है कि 'स्वीकार करें' शीर्षलेख है। –

+1

@fab फिक्स्ड। आप सही हैं;) –

1

मैं अन्य जवाब से असहमत है कि यह निर्णय एसईओ या कैसे 'अनुकूल' एक यूआरएल है के साथ कोई लेना देना चाहिए (रोबोट लोग भी [द्वारा लिखित] कर रहे हैं!)। लेकिन मेरा अंतर्ज्ञान मुझे बताता है कि बेहतर एसईओ परिणाम से यूआरआई को एकीकृत करते हैं, क्योंकि यह आपके एपीआई यूआरआई विश्व जंगली वेब से जुड़ा होगा (संभावना नहीं) घटना में पेजरैंक को भी एकीकृत करता है।

यह निर्णय बाकी है जो आपके सर्वर और क्लाइंट सक्षम हैं। अगर वे अनुरोध हेडर स्वीकार कर सकते हैं, और आपका सर्वर पारदर्शी सामग्री वार्तालाप करने के लिए पर्याप्त स्मार्ट है, तो हर तरह से यूआरआई को एकजुट करें। यह वही है जो मैं करता हूं (मेरा एकमात्र JSON क्लाइंट हालांकि स्वयं है, मेरे वेब ऐप के अन्य HTML हिस्सों से एजेक्स अनुरोध जारी करता है, जहां मैं स्वीकृति हेडर को नियंत्रित करता हूं)।

यदि कोई ग्राहक अनुरोध शीर्षलेख सेट करने में सक्षम नहीं है, जैसे वेब उपयोगकर्ता जेसन प्रतिक्रिया प्राप्त करना चाहते हैं, तो वे डिफ़ॉल्ट (संभवतः टेक्स्ट/एचटीएमएल) के साथ समाप्त हो जाएंगे। इस कारण से आप गैर-वार्तालाप प्रतिक्रियाओं को अद्वितीय यूआरआई (/foo.txt, /foo.rtf) के अंतर्गत होने की अनुमति दे सकते हैं। परंपरागत रूप से यह एक बिंदु द्वारा पृथक यूआरआई के प्रारूप को जोड़कर किया जाता है, जैसे कि यह एक फ़ाइल नाम एक्सटेंशन था (लेकिन यह आमतौर पर नहीं है, mod_rewrite juggling करता है) ताकि पुराने नाम वाले प्लेटफ़ॉर्म पर फ़ाइल नाम फ़ाइल एक्सटेंशन को सहेज सकें एक सार्थक के साथ।

इस तरह मेरी साइट काम कुछ पर अधिकांश पृष्ठों:

  1. अनुरोध URL से SQL क्वेरी निर्धारित करें। (उदाहरण के लिए /cars?colour=black =>SELECT * FROM cars WHERE colour='black')
  2. SQL क्वेरी जारी करें।
  3. इस फ़ाइल द्वारा समर्थित सूची से स्वीकार्य प्रतिक्रिया प्रकार निर्धारित करें। यह आमतौर पर एचटीएमएल और एचएएल (यानी जेएसओएन) होता है, हालांकि कभी-कभी एक्सएमएल भी होता है। text/html पर वापस आना अगर कुछ भी स्वीकार्य नहीं है।
  4. अगर (एचटीएमएल) <HEAD> और <NAV> थूक से बाहर (पैरामीटर पर विचार: <h1>Black Cars</h1>)
  5. सबसे स्वीकार्य प्रतिक्रिया प्रकार का उपयोग कर परिणाम बाहर थूक।
    यह समारोह कैसे एक एसक्यूएल परिणाम वस्तु एचएएल के _links कुंजी, XLink तत्वों की एक धारा, एक HTML <TABLE> तत्व (<A> तत्वों से युक्त कोशिकाओं के साथ) लेने के लिए और Link हेडर, एचटीएमएल <LINK> तत्वों की एक धारा यह HTTP में बदलने के लिए, जानता है, या एक सीएसवी फ़ाइल। एसक्यूएल क्वेरी 0 पंक्तियों को वापस कर सकती है, इस मामले में यदि उस आउटपुट का उपयोग किया जा रहा था तो एक HTML तालिका के बजाय उपयोगकर्ता के अनुकूल संदेश लिखा गया है।
  6. अगर (एचटीएमएल) <FOOTER>

थूक से बाहर यह बुनियादी रूपरेखा हालांकि हर एक विकल्प अनुरोध URI आह्वान कर सकते हैं का एक अलग सेट है, तो, अपने वेब अनुप्रयोग में के बारे में 30 विभिन्न संसाधन संग्रह संभालती प्रत्येक की शुरुआत पैरामीटर सत्यापन के मामले में अलग है।

तो, अब मैंने यह सब समझाया है, आप देख सकते हैं कि एक ही स्थान पर संभाले गए प्रत्येक संसाधन के सभी विनिर्देशों के लिए उपयोगी हो सकता है, और प्रारूप एक्स में आउटपुट करने के जेनेरिक या एक सामान्य पुस्तकालय द्वारा प्रबंधित प्रारूप वाई समारोह। यह एक कार्यान्वयन विवरण है जो मेरे जीवन को आसान बनाता है और मुझे अपने आप को दोहराने के लिए पालन करने में मदद करता है।

+0

आदर्श दुनिया में, आप सही हैं। वास्तविक दुनिया में, आपको 'http: // mysite.com/ब्लॉग/my-blog-post-title/1/2012-02-14' की आवश्यकता है। यही कारण है कि मैं उल्लेख करता हूं कि यूआरएल स्कीमा में एसईओ एक महत्वपूर्ण बिंदु है। –

+0

नहीं, आप मुझे वापस-सामने ले गए। मैं कह रहा हूं कि आपको अपने एपीआई के लिए 'http: // mysite.com/ब्लॉग/my-blog-post-title/1/2012-02-14' का उपयोग करना चाहिए। एसईओ यूआरएल विकल्प को ठीक करता है, ठीक है, लेकिन यह प्रभावित नहीं करता है कि परक्राम्य संसाधनों के लिए एक ही यूआरएल का उपयोग करना है या नहीं। –

+0

उहम, लेकिन यह मेरे लिए एपीआई के अनुकूल दोस्ताना यूआरएल का उपयोग कर बदसूरत लगता है। वास्तव में, विपणन आवश्यकताओं के कारण दोस्ताना यूआरएल ओवरटाइम बदल सकता है। उनका उपयोग आरईएसटी के लिए पर्याप्त स्थिर नहीं है। दूसरी तरफ, एसईओ एक अच्छा एसईओ एपीआई के नियम तोड़ता है: यह संसाधन अभिविन्यास के संदर्भ में कुछ भी नहीं कह सकता है: यह सिर्फ ऑनलाइन मार्केटिंग है! –

0

मैं निश्चित रूप से वेब साइट == वेब-सेवा दृष्टिकोण से सहमत नहीं हूं।

बस शब्दों में कहें, वेबसाइट को क्लाइंट के रूप में माना जाना चाहिए, केवल एक ग्राहक, जो वेब-सेवा का उपभोग करता है और डेटा को वेब उपयोग के लिए उचित रूप में प्रस्तुत करता है। एक मोबाइल एप्लिकेशन की तरह ही एक ग्राहक होता है, केवल एक ग्राहक, एक ही वेब-सेवा का उपभोग करता है और डेटा को मोबाइल उपयोग के लिए उचित रूप में प्रस्तुत करता है।

वेब-सेवा सेवा प्रदाता है। अन्य सभी सिर्फ ग्राहक हैं; वेब साइट, एंड्रॉइड ऐप, आईफोन ऐप, ... आदि।

संबंधित मुद्दे

 संबंधित मुद्दे