URL मैट्रिक्स पैरामीटर बनाम क्वेरी पैरामीटर


176

मैं सोच रहा हूं कि अपने URL में मैट्रिक्स या क्वेरी पैरामीटर का उपयोग करूं या नहीं। मुझे उस विषय पर एक पुरानी चर्चा संतोषजनक नहीं लगी।

उदाहरण

पहली नजर में मैट्रिक्स पैरेम्स के केवल फायदे हैं:

  • अधिक पठनीय है
  • XML दस्तावेजों में "और" की एन्कोडिंग और डिकोडिंग की आवश्यकता नहीं है
  • "?" कई मामलों में कैश नहीं किया जाता है; मैट्रिक्स params वाले URL कैश किए गए हैं
  • मैट्रिक्स पैरामीटर रास्ते में हर जगह दिखाई दे सकते हैं और इसके अंत तक सीमित नहीं हैं
  • मैट्रिक्स पैरामीटर में एक से अधिक मूल्य हो सकते हैं: paramA=val1,val2

लेकिन इसके नुकसान भी हैं:

  • केवल JAX-RS समर्थन मैट्रिक्स मापदंडों जैसे कुछ ढांचे
  • जब कोई ब्राउज़र GET के माध्यम से एक फॉर्म सबमिट करता है, तो params क्वेरी परम बन जाते हैं। तो यह एक ही कार्य के लिए दो प्रकार के मापदंडों में समाप्त होता है। REST सेवाओं के उपयोगकर्ताओं को भ्रमित न करने और सेवाओं के डेवलपर्स के लिए प्रयास को सीमित करने के लिए, इस क्षेत्र में हमेशा क्वेरी परम का उपयोग करना आसान होगा।

चूंकि सेवा के डेवलपर मैट्रिक्स परम समर्थन के साथ एक फ्रेमवर्क चुन सकते हैं, केवल शेष नुकसान यह होगा कि ब्राउज़र डिफ़ॉल्ट क्वेरी मापदंडों द्वारा बनाते हैं।

क्या कोई और नुकसान हैं? तुम क्या करोगे?


10
मुझे यकीन नहीं है कि मैट्रिक्स यूआरएल के साथ बड़ी बात क्या है। टीबीएल ने जो डब्ल्यू 3 सी डिजाइन लेख लिखा था, उसके अनुसार, यह केवल एक डिजाइन विचार था और स्पष्ट रूप से बताता है कि यह वेब की विशेषता नहीं है। इसका उपयोग करते समय सापेक्ष URL जैसी चीजें लागू नहीं की जाती हैं। यदि आप इसका उपयोग करना चाहते हैं, तो यह ठीक है; इसका उपयोग करने का कोई मानक तरीका नहीं है क्योंकि यह एक मानक नहीं है।
स्टीव पोमेरॉय

2
@ स्वेट पोमरोय: क्या यह लेख आप का उल्लेख है: w3.org/DesignIssues/MatrixURIs.html
मार्सेल

3
@ मार्सेल: हाँ। मैट्रिक्स URL के बारे में सोचने वालों के लिए, दस्तावेज़ के शीर्ष पर "स्थिति: व्यक्तिगत दृश्य" नोट करें।
स्टीव पोमोरॉय

क्या मैट्रिक्स पैरामेट्स का एक से अधिक मूल्य हो सकता है? वास्तव में?
अय्यश

जवाबों:


212

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

http://example.com/res/categories;name=foo/objects;name=green/?page=1

यह वास्तव में नाम स्थान पर आता है।

नोट: यहाँ संसाधनों के 'स्तर' हैं categoriesऔर objects

यदि बहु-स्तरीय URL के लिए केवल क्वेरी पैरामीटर का उपयोग किया गया था, तो आप समाप्त कर देंगे

http://example.com/res?categories_name=foo&objects_name=green&page=1

इस तरह आप अनुरोध के भीतर मापदंडों की स्थानीयता द्वारा जोड़ी गई स्पष्टता को भी खो देंगे। इसके अलावा, JAX-RS जैसे ढांचे का उपयोग करते समय, सभी क्वेरी पैरामीटर प्रत्येक संसाधन हैंडलर के भीतर दिखाई देंगे, जिससे संभावित टकराव और भ्रम पैदा होगा।

यदि आपकी क्वेरी में केवल एक "स्तर" है, तो अंतर वास्तव में महत्वपूर्ण नहीं है और दो प्रकार के पैरामीटर प्रभावी रूप से विनिमेय हैं, हालांकि, क्वेरी पैरामीटर आमतौर पर बेहतर समर्थित हैं और अधिक व्यापक रूप से मान्यता प्राप्त हैं। सामान्य तौर पर, मैं सुझाव दूंगा कि आप HTML फ़ॉर्म और सरल, एकल-स्तरीय HTTP API जैसी चीज़ों के लिए क्वेरी मापदंडों से चिपके रहें।


2
असंबद्ध: क्या /?भाग संसाधन का प्रतिनिधित्व करता है ?
जिन क्वोन

7
?अनुरोध के क्वेरी पैरामीटर भाग शुरू होता है। मैट्रिक्स पैरामीटर के विपरीत क्वेरी पैरामीटर URL पैरामीटर का सबसे सामान्य प्रकार है। प्रश्न चिह्न से पहले स्लैश सुनिश्चित करता है कि क्वेरी पैरामीटर pageस्लैश से पहले मैट्रिक्स पैरामीटर में नहीं चलता है। मुझे लगता है कि अगर कोई मैट्रिक्स पैरामीटर संलग्न नहीं थे categories, तो क्वेरी पैरामीटर इस तरह से स्लैश के बिना संलग्न हो सकते हैं:http://example.com/res/categories?page=1
Teemu Leisti

8
हालांकि यह सच है कि मैट्रिक्स पैरामीटर को किसी भी पथ खंड में निर्दिष्ट किया जा सकता है, उदाहरण के लिए JAX-RS उन्हें उस पथ खंड से संबद्ध नहीं करता है जो उन्हें @MatrixParam के साथ इंजेक्शन करते समय जोड़ा गया था। "रेस्टफुल जावा विद जेएक्स-आरएस 2.0" के अनुसार, "जीईटी / मर्सिडीज / ई 55; कलर = ब्लैक / 2006 / इंटीरियर; कलर = टैन" जैसे अनुरोध में कलर मैट्रिक्स परम की अस्पष्ट परिभाषा होगी। यद्यपि ऐसा लगता है कि यदि आप प्रत्येक PathSegment को व्यक्तिगत रूप से संसाधित करते हैं, तो आप इसका पता लगा सकते हैं ... यदि आप श्रेणी निर्दिष्ट करते हैं, तो इससे अधिक उपयोगी लेकिन अधिक काम करने के लिए =Noo = foo ;NNN = हरा।
UFL1138

15

टिम सिल्वेस्टर के जवाब के अलावा मैं एक उदाहरण प्रदान करना चाहूंगा कि कैसे मैट्रिक्स मापदंडों को JAX-RS के साथ संभाला जा सकता है ।

  1. अंतिम संसाधन तत्व पर मैट्रिक्स पैरामीटर

    http://localhost:8080/res/categories/objects;name=green

    आप @MatrixParamएनोटेशन का उपयोग करके उन्हें एक्सेस कर सकते हैं

    @GET
    @Path("categories/objects")
    public String objects(@MatrixParam("name") String objectName) {
      return objectName;
    }

    प्रतिक्रिया

    green

    लेकिन जवादोक राज्यों की तरह

    ध्यान दें कि @MatrixParamएनोटेशन मान एक मैट्रिक्स पैरामीटर के नाम को संदर्भित करता है, जो मैट्रिक्स पैरामीटर के मान को इंजेक्ट करने वाले पथ-एनोटेट जावा संरचना के अंतिम मिलान पथ खंड में रहता है ।

    ... क्या हमें बिंदु 2 पर लाता है

  2. एक URL के बीच में मैट्रिक्स पैरामीटर

    http://localhost:8080/res/categories;name=foo/objects;name=green

    आप पथ चर का उपयोग करके कहीं भी मैट्रिक्स मापदंडों का उपयोग कर सकते हैं और @PathParam PathSegment

    @GET
    @Path("{categoryVar:categories}/objects")
    public String objectsByCategory(@PathParam("categoryVar") PathSegment categorySegment, 
                                    @MatrixParam("name") String objectName) {
      MultivaluedMap<String, String> matrixParameters = categorySegment.getMatrixParameters();
      String categorySegmentPath = categorySegment.getPath();
      String string = String.format("object %s, path:%s, matrixParams:%s%n", objectName,
              categorySegmentPath, matrixParameters);
      return string;
    }

    प्रतिक्रिया

    object green, path:categories, matrixParams:[name=foo]

    चूंकि मैट्रिक्स पैरामीटर प्रदान किए जाते हैं, क्योंकि MultivaluedMapआप प्रत्येक द्वारा पहुंच सकते हैं

    List<String> names = matrixParameters.get("name");

    या यदि आप केवल पहले एक की जरूरत है

    String name = matrixParameters.getFirst("name");
  3. एक विधि पैरामीटर के रूप में सभी मैट्रिक्स पैरामीटर प्राप्त करें

    http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size

    List<PathSegment>उन सभी को प्राप्त करने के लिए एक का उपयोग करें

    @GET
    @Path("all/{var:.+}")
    public String allSegments(@PathParam("var") List<PathSegment> pathSegments) {
      StringBuilder sb =  new StringBuilder();
    
      for (PathSegment pathSegment : pathSegments) {
        sb.append("path: ");
        sb.append(pathSegment.getPath());
        sb.append(", matrix parameters ");
        sb.append(pathSegment.getMatrixParameters());
        sb.append("<br/>");
      }
    
      return sb.toString();
    }

    प्रतिक्रिया

    path: categories, matrix parameters [name=foo]
    path: objects, matrix parameters [name=green]
    path: attributes, matrix parameters [name=size]

10

- टिप्पणी अनुभाग को फिर से प्रकाशित करना महत्वपूर्ण है। -

मुझे यकीन नहीं है कि मैट्रिक्स यूआरएल के साथ बड़ी बात क्या है। टीबीएल ने जो डब्ल्यू 3 सी डिजाइन लेख लिखा है, उसके अनुसार, यह सिर्फ एक डिजाइन विचार था और स्पष्ट रूप से बताता है कि यह वेब की विशेषता नहीं है। इसका उपयोग करते समय सापेक्ष URL जैसी चीजें कार्यान्वित नहीं की जाती हैं। यदि आप इसका उपयोग करना चाहते हैं, तो यह ठीक है; इसका उपयोग करने का कोई मानक तरीका नहीं है क्योंकि यह एक मानक नहीं है। - स्टीव पोमेरॉय

तो संक्षिप्त उत्तर है, यदि आपको व्यावसायिक उद्देश्य के लिए RS की आवश्यकता है, तो आप अनुरोध पैरामीटर का उपयोग करके बेहतर हैं।


5
कोई यह बताता है कि एंगुलर 2 डेवलपर्स ने फैसला किया था कि वे इतने अनूठे थे कि उन्हें इसके बजाय इसे लागू करने की आवश्यकता थी!
मैट पिल्गी

2
@MattPileggi मैं इसे Angular 2 के कारण भी पढ़ रहा हूं। Angular 2 का लगभग हर पहलू अत्यधिक विशिष्ट, अपरंपरागत और मौजूदा उपयोग पैटर्न के साथ बाधाओं पर है। यह अभी तक अप्रमाणित नहीं है क्योंकि इससे शमन मूल्य में वृद्धि होती है।
अलुआन हदाद

1
तो दोस्तों, मैं यहाँ भी उसी कारण से हूँ, लेकिन मुझे इस मुद्दे के साथ url मैट्रिक्स और गूगल एनालिसिस के बारे में इस अंक के साथ कोणीय 2 टीम github पेज पर कुछ अंक जोड़ने दें: github.com/angular/angular/issues74040 लेकिन इसके बारे में कुछ शोध के बाद, url मैट्रिक्स नोटेशन url क्वेरी मापदंडों की तुलना में अधिक मानव-पठनीय प्रतीत होता है , मुख्यतः जब हमें मध्य या url में कुछ पैरामीटर की आवश्यकता होती है (न केवल इसके अंत में)।
रिचर्ड ली

8
मुझे लगता है कि हर कोई जो सोचता है कि यह गैर-मानक है वह uri टेम्पलेट कल्पना से परिचित नहीं है? पथ परिमों में जटिल वस्तुओं को एनकोड करना यूआरआई टेम्प्लेट की एक बहुत ही उपयोगी विशेषता है; सिर्फ इसलिए कि ज्यादातर लोग इसके बारे में नहीं जानते हैं या इसका उपयोग नहीं करते हैं, इसका मतलब यह नहीं है कि यह आपके जीवन में बेकार जटिलता को इंजेक्ट करने के लिए कोणीय देवों द्वारा कुछ बुरी साजिश है।
अजाक्स

2
Pftft - "<चीज मुझे अब तक मौजूद नहीं थी> गैर-मानक है, इस प्रकार यह मेरी अज्ञानता की स्वीकार्यता को संरक्षित करता है"। टीबीएल ने एक विचार के साथ क्या किया या क्या नहीं किया, यह काफी हद तक सारहीन है। यह 2001 में उनके वेब की एक विशेषता नहीं थी । वेब की विशेषताएं क्लाइंट और सर्वर कार्यान्वयनकर्ता जो भी उन्हें चुनते हैं। यदि कोणीय मैट्रिक्स पैरामस का समर्थन करता है और JAX-RS उनका समर्थन करता है और ये आप कार्यान्वयन उपकरण चुने गए हैं तो आगे बढ़ें और क्या काम करें।
डेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.