سؤال

أتساءل عما إذا كنت تريد استخدام المعلمات مصفوفة أو الاستعلام في عناوين URL الخاصة بي. لقد وجدت كبار السن نقاش لهذا الموضوع لا يرضي.

أمثلة

يبدو أن علامات مصفوفة النظرة الأولى لديها مزايا فقط:

  • أكثر قابلية للقراءة
  • لا يوجد ترميز وفك تشفير "&" في مستندات XML
  • عناوين URL مع "؟" لا تخزين مؤقتا في كثير من الحالات؛ يتم تخزين عناوين URL مع مخفاة مصفوفة مخزنة
  • يمكن أن تظهر معلمات مصفوفة في كل مكان في المسار ولا تقتصر على نهايتها
  • يمكن أن تحتوي المعلمات مصفوفة على أكثر من قيمة واحدة: paramA=val1,val2

ولكن هناك أيضا عيوب:

  • فقط عدد قليل من الأطر مثل جاكس روبية دعم المعلمات مصفوفة
  • عندما يقدم المستعرض نموذجا عبر GET، تصبح الأمر يتعلق بالمعلمات أمر الاستعلام. لذلك ينتهي في نوعين من المعلمات لنفس المهمة. لعدم الخلط بين مستخدمي خدمات الراحة والحد من الجهد لمطوري الخدمات، سيكون من الأسهل استخدام معارقة الاستعلام دائما - في هذا المجال.

نظرا لأن مطور الخدمة يمكن أن تختار إطارا مع دعم فارم مصفوفة، فإن العيب الوحيد المتبقي سيكون أن المتصفحات تنشئ معلمات الاستعلام الافتراضية.

هل هناك أي عيوب أخرى؟ ماذا كنت ستفعل؟

هل كانت مفيدة؟

المحلول

الفرق المهم هو أن معلمات مصفوفة تنطبق على عنصر مسار معين أثناء تنطبق معلمات الاستعلام على الطلب ككل. يأتي هذا في اللعب عند إجراء استعلام معقد على طراز الراحة إلى مستويات متعددة من الموارد والموارد الفرعية:

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

انه حقا يأتي إلى namespacing. إذا تم استخدام معلمات الاستعلام فقط، فسوف ينتهي بك الأمر مع المعلمات مثل "Cyty_Name" و "Object_name" وستفقد الوضوح المضافة بواسطة محلية المعلمات داخل الطلب. بالإضافة إلى ذلك، عند استخدام إطار عمل مثل Jax-RS، فإن جميع معلمات الاستعلام ستظهر داخل كل معالج موارد، مما يؤدي إلى تعارضات وإلغاء الارتباك المحتمل.

إذا كان لاستعلامك يحتوي على "مستوى" واحد فقط، فلا يوجد الفرق مهم حقا وأن يكون النوعان من المعلمات قابلة للتبديل بفعالية، إلا أن معلمات الاستعلام مدعومة بشكل أفضل بشكل أفضل وأكثر اعترافا على نطاق واسع. بشكل عام، أود أن أوصي بأن تلتصق مع معلمات الاستعلام للأشياء مثل نماذج HTML وبسيطة واجهات برمجة التطبيقات HTTP البسيطة على مستوى واحد.

نصائح أخرى

- من المهم أن تتخلص إلى قسم التعليق .--

لست متأكدا من الصفقة الكبيرة مع عناوين URL المصفوفة. وفقا لمقال تصميم W3C الذي كتب TBL، كان مجرد فكرة تصميم وينص بشكل صريح على أنه ليس ميزة الويب. لا يتم تنفيذ أشياء مثل عناوين المواقع النسبية عند استخدامها. إذا كنت ترغب في استخدامه، فهذا جيد؛ ليس هناك طريقة قياسية فقط لاستخدامها لأنها ليست معيارا. - ستيف بوميروي

الإجابة القصيرة جدا، إذا كنت بحاجة إلى روبية للأغراض التجارية، فأنت أفضل حالا باستخدام معلمة الطلب.

بالإضافة إلى تيم سيلفستر الإجابة أود أن أقدم مثالا على كيفية التعامل مع معلمات مصفوفة جاكس روبية .

  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 تشير قيمة التوضيحية إلى اسم معلمة مصفوفة موجودة في آخر قطاع المسار المتطابق من هيكل Java المشروح بالمسار الذي يقوم بحقن قيمة المعلمة مصفوفة.

    ... ما يجلبنا إلى نقطة 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]
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top