พารามิเตอร์เมทริกซ์ URL เทียบกับพารามิเตอร์การสืบค้น


176

ฉันสงสัยว่าจะใช้เมทริกซ์หรือพารามิเตอร์การสืบค้นใน URL ของฉันหรือไม่ ฉันพบการสนทนาที่เก่ากว่าในหัวข้อนั้นไม่พอใจ

ตัวอย่าง

ตั้งแต่แรกพบเมทริกซ์ params ดูเหมือนจะมีข้อได้เปรียบเท่านั้น:

  • อ่านได้มากขึ้น
  • ไม่จำเป็นต้องเข้ารหัสและถอดรหัส "&" ในเอกสาร XML
  • URL ด้วย "?" ไม่ถูกแคชในหลายกรณี URL ที่มีพารามิเตอร์พาราเมทริกถูกแคช
  • พารามิเตอร์เมทริกซ์สามารถปรากฏได้ทุกที่ในเส้นทางและไม่ จำกัด เฉพาะจุดสิ้นสุด
  • พารามิเตอร์เมทริกซ์สามารถมีได้มากกว่าหนึ่งค่า: paramA=val1,val2

แต่ก็มีข้อเสีย:

  • กรอบงานเพียงไม่กี่อย่างเช่นJAX-RSรองรับพารามิเตอร์เมทริกซ์
  • เมื่อเบราว์เซอร์ส่งแบบฟอร์มผ่าน GET พารามิเตอร์จะกลายเป็นพารามิเตอร์แบบสอบถาม ดังนั้นมันจึงสิ้นสุดลงในพารามิเตอร์สองชนิดสำหรับงานเดียวกัน เพื่อไม่ให้ผู้ใช้สับสนกับบริการ REST และ จำกัด ความพยายามสำหรับนักพัฒนาบริการมันจะง่ายกว่าที่จะใช้ params แบบสอบถามแบบทั่วไป - ในพื้นที่นี้

เนื่องจากผู้พัฒนาบริการสามารถเลือกเฟรมเวิร์กที่สนับสนุนเมทริกซ์พารารัมข้อเสียที่เหลืออยู่เพียงอย่างเดียวคือเบราว์เซอร์ที่สร้างโดยพารามิเตอร์การสืบค้นเริ่มต้น

มีข้อเสียอื่น ๆ อีกไหม? คุณจะทำอย่างไร


10
ฉันไม่แน่ใจว่าเรื่องใหญ่คืออะไรกับ URL เมทริกซ์ ตามบทความการออกแบบ w3c ที่ TBL เขียนมันเป็นเพียงแนวคิดการออกแบบและระบุอย่างชัดเจนว่าไม่ใช่คุณสมบัติของเว็บ สิ่งต่างๆเช่น URL สัมพัทธ์จะไม่ถูกนำมาใช้เมื่อใช้งาน ถ้าคุณต้องการใช้มันก็โอเค ไม่มีวิธีมาตรฐานในการใช้เพราะไม่ใช่มาตรฐาน
Steve Pomeroy

2
@Steve Pomeroy: นี่คือบทความที่คุณพูดถึง: w3.org/DesignIssues/MatrixURIs.html
Marcel

3
@Marcel: yup สำหรับผู้ที่คิดเกี่ยวกับ URL ของเมทริกซ์ให้สังเกต "สถานะ: มุมมองส่วนบุคคล" ที่ด้านบนของเอกสาร
Steve Pomeroy

params matrix มีค่ามากกว่าหนึ่งค่าได้หรือไม่ จริงๆ?
Ayyash

คำตอบ:


212

ความแตกต่างที่สำคัญคือพารามิเตอร์เมทริกซ์ใช้กับองค์ประกอบพา ธ เฉพาะขณะที่พารามิเตอร์เคียวรีใช้กับคำร้องขอโดยรวม สิ่งนี้เข้ามาเมื่อทำการเคียวรีสไตล์ REST ที่ซับซ้อนไปยังหลายระดับของทรัพยากรและทรัพยากรย่อย:

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

มันลงมาเพื่อการวางชื่อ

หมายเหตุ: 'ระดับ' ของทรัพยากรที่นี่และcategoriesobjects

หากมีการใช้เฉพาะพารามิเตอร์การสืบค้นสำหรับ URL หลายระดับคุณจะต้องสิ้นสุด

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

วิธีนี้คุณจะสูญเสียความคมชัดที่เพิ่มโดยตำแหน่งของพารามิเตอร์ภายในคำขอ นอกจากนี้เมื่อใช้เฟรมเวิร์กเช่น JAX-RS พารามิเตอร์เคียวรีทั้งหมดจะแสดงขึ้นภายในตัวจัดการรีซอร์สแต่ละตัวซึ่งนำไปสู่ความขัดแย้งและความสับสนที่อาจเกิดขึ้น

หากข้อความค้นหาของคุณมีเพียง "ระดับ" เท่านั้นความแตกต่างนั้นไม่สำคัญจริงๆและพารามิเตอร์ทั้งสองประเภทนั้นสามารถใช้แทนกันได้อย่างมีประสิทธิภาพอย่างไรก็ตามโดยทั่วไปพารามิเตอร์ข้อความค้นหาจะได้รับการสนับสนุนที่ดีขึ้นและเป็นที่รู้จักมากขึ้น โดยทั่วไปแล้วฉันขอแนะนำให้คุณใช้พารามิเตอร์การสืบค้นสำหรับสิ่งต่าง ๆ เช่นแบบฟอร์ม HTML และ HTTP API ระดับเดียวแบบง่าย


2
ไม่เกี่ยวข้อง: /?ส่วนหนึ่งเป็นตัวแทนของทรัพยากรหรือไม่
Jin Kwon

7
?เริ่มต้นส่วนพารามิเตอร์การค้นหาของการร้องขอ พารามิเตอร์เคียวรีเป็นพารามิเตอร์ URL ชนิดที่พบบ่อยที่สุดซึ่งตรงข้ามกับพารามิเตอร์เมทริกซ์ เครื่องหมายทับหน้าเครื่องหมายคำถามทำให้แน่ใจว่าพารามิเตอร์แบบสอบถามpageไม่ได้ทำงานในพารามิเตอร์เมทริกซ์ที่นำหน้าเครื่องหมายทับ ผมคิดว่าถ้าไม่มีพารามิเตอร์เมทริกซ์ที่แนบมากับcategoriesพารามิเตอร์แบบสอบถามสามารถแนบโดยไม่ต้องเฉือนเช่นนี้:http://example.com/res/categories?page=1
เทียมู Leisti

8
ในขณะที่เป็นจริงที่อาจระบุพารามิเตอร์เมทริกซ์ในส่วนของเส้นทางใด ๆ ตัวอย่างเช่น JAX-RS ไม่ได้เชื่อมโยงพวกเขากับส่วนของเส้นทางที่พวกเขาถูกผนวกเข้าเมื่อฉีดด้วย @MatrixParam ตาม "Restful Java with JAX-RS 2.0" คำขอเช่น "GET / mercedes / e55; color = black / 2006 / interior; color = tan" จะมีคำจำกัดความที่ชัดเจนของพารามิเตอร์เมทริกซ์สี แม้ว่ามันจะดูเหมือนว่าถ้าคุณดำเนินการแต่ละ PathSegment คุณสามารถคิดออก ... มีประโยชน์ แต่งานที่จะได้รับมากกว่าที่คุณระบุ categoryName = foo; objectName = green
UFL1138

15

นอกจากคำตอบของ Tim Sylvesterแล้วฉันต้องการแสดงตัวอย่างว่าพารามิเตอร์เมทริกซ์สามารถจัดการกับ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

    แต่ชอบรัฐ Javadoc

    โปรดทราบว่า@MatrixParamค่าคำอธิบายประกอบหมายถึงชื่อของพารามิเตอร์เมทริกซ์ที่อยู่ในส่วนของเส้นทางที่จับคู่ล่าสุดของโครงสร้าง Java ที่มีคำอธิบายประกอบแบบ Path-annotated ที่แทรกค่าของพารามิเตอร์เมทริกซ์

    ... อะไรทำให้เราถึงจุดที่ 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

    ใช้ a 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

- สิ่งสำคัญที่จะถูกผลักไสให้แสดงความคิดเห็นส่วน

ฉันไม่แน่ใจว่าเรื่องใหญ่คืออะไรกับ URL เมทริกซ์ ตามบทความการออกแบบ w3c ที่ TBL เขียนมันเป็นเพียงแนวคิดการออกแบบและระบุอย่างชัดเจนว่าไม่ใช่คุณสมบัติของเว็บ สิ่งต่างๆเช่น URL สัมพัทธ์จะไม่ถูกนำมาใช้เมื่อใช้งาน ถ้าคุณต้องการใช้มันก็โอเค ไม่มีวิธีมาตรฐานในการใช้เพราะไม่ใช่มาตรฐาน - Steve Pomeroy

ดังนั้นคำตอบสั้น ๆ คือถ้าคุณต้องการ RS เพื่อจุดประสงค์ทางธุรกิจคุณจะดีขึ้นโดยใช้พารามิเตอร์คำขอ


5
มีคนบอกว่าสำหรับนักพัฒนา Angular 2 ที่ตัดสินใจว่าพวกเขาไม่เหมือนใครพวกเขาจำเป็นต้องใช้สิ่งนี้แทน!
Matt Pileggi

2
@MattPileggi ฉันกำลังอ่านสิ่งนี้เนื่องจาก Angular 2 เกือบทุกแง่มุมของ Angular 2 มีความเชี่ยวชาญสูงไม่เป็นทางการและแปลกใหม่ด้วยรูปแบบการใช้งานที่มีอยู่ มันเป็นยังไม่ได้พิสูจน์ว่าสิ่งนี้เพิ่มมูลค่าบรรเทา
Aluan Haddad

1
งั้นฉันมาที่นี่ด้วยเหตุผลเดียวกัน แต่ขอเพิ่มประเด็นนี้กับปัญหานี้เกี่ยวกับ url matrix และ google analytis บนหน้า gitub ทีมเชิงมุม 2: github.com/angular/angular/angular/issues/11740 แต่ หลังจากการวิจัยเกี่ยวกับเรื่องนี้สัญกรณ์เมทริกซ์ของ url จะปรากฏขึ้นโดยมนุษย์สามารถอ่านได้มากกว่าพารามิเตอร์การสืบค้น urlส่วนใหญ่เมื่อเราต้องการพารามิเตอร์บางตัวที่อยู่ตรงกลางหรือ url (ไม่เพียง แต่ในตอนท้าย)
Richard Lee

8
ฉันเดาว่าทุกคนที่คิดว่านี่ไม่ใช่แบบมาตรฐานไม่คุ้นเคยกับสเปคของ uri template ใช่ไหม การเข้ารหัสวัตถุที่ซับซ้อนในเส้นทาง params เป็นคุณสมบัติที่มีประโยชน์มากของแม่แบบ uri; เพียงเพราะคนส่วนใหญ่ไม่รู้หรือใช้งานไม่ได้หมายความว่ามันเป็นการสมคบคิดชั่วร้ายโดย devs เชิงมุมเพื่อฉีดความซับซ้อนที่ไร้ประโยชน์เข้ามาในชีวิตของคุณ
Ajax

2
Pffft - "<สิ่งที่ฉันไม่เคยรู้มาก่อนจนกระทั่งตอนนี้> นั้นไม่ได้มาตรฐานดังนั้นจึงรักษาความเป็นที่ยอมรับของความเขลาของฉันไว้" สิ่งที่ TBL ทำหรือไม่ตัดสินใจเกี่ยวกับความคิดนั้นสำคัญมาก มันไม่ได้เป็นคุณสมบัติของเว็บของเขาในปี 2001 คุณสมบัติของเว็บเป็นสิ่งที่ลูกค้าและผู้ใช้งานเซิร์ฟเวอร์เลือกให้เป็น หาก Angular รองรับ matrix params และ JAX-RS ก็รองรับพวกมันและคุณคือตัวเลือกเครื่องมือในการนำไปใช้งานและใช้งานได้ดี
เดฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.