2015-11-09 14 views
8

Vấn đề (hoặc thiếu tính năng) là thiếu khả năng diễn đạt giữa các tham số truy vấn khác nhau. Như tôi thấy, bạn chỉ có thể chỉ định and giữa các thông số, nhưng làm cách nào để giải quyết nó nếu bạn muốn có not equal, or hoặc xor?Làm cách nào để diễn tả các biểu thức nâng cao giữa các tham số truy vấn trong một API REST?

Tôi muốn để có thể bày tỏ những thứ như:

Tất cả người dùng với 20 tuổi hoặc tên Bosse

/người dùng tuổi = 22 | name = Bosse

?

Tất cả người dùng ngoại trừ David và Lennart

?!

/người dùng name = David & name = Lennart

ý tưởng đầu tiên của tôi là sử dụng một tham số gọi là truy vấn _filter và tham gia một String với biểu hiện của tôi như thế này:

Tất cả người dùng với với 22 tuổi hoặc một tên đó không phải là Bosse

/người dùng? _filter = tuổi eq 22 hoặc tên NEQ Bosse

Giải pháp tốt nhất cho vấn đề này là gì?

Tôi đang viết API của mình với Java và Jersey, vì vậy nếu có bất kỳ giải pháp đặc biệt nào cho Jersey, hãy cho tôi biết.

+0

như tôi biết, không có sẵn sàng để sử dụng giải pháp cho usecase này. Chuyển truy vấn trong thuộc tính lọc như bạn đã nói và triển khai truy vấn bằng cách phân tích cú pháp bộ lọc và phản hồi lại biểu thức được phân tích cú pháp. – Simulant

+0

Bạn có thể mã hóa các ký tự sau: https://en.wikipedia.org/wiki/Character_encodings_in_HTML – Thevenin

+0

@Thevenin: Bạn có thể cho ví dụ về cách tôi có thể sử dụng tính năng này không? –

Trả lời

3

tôi có thể thấy hai giải pháp để đạt được điều đó:

  • Sử dụng một tham số truy vấn đặc biệt có chứa các biểu hiện khi thực hiện một phương pháp GET. Đó là cách OData thực hiện với thông số $filter của chúng tôi (xem liên kết này: https://msdn.microsoft.com/fr-fr/library/gg309461.aspx#BKMK_filter).Dưới đây là một ví dụ:

    /AccountSet?$filter=AccountCategoryCode/Value eq 2 or AccountRatingCode/Value eq 1 
    

    Parse.com cũng sử dụng cách tiếp cận như vậy với tham số where của nó nhưng truy vấn được mô tả bằng một cấu trúc JSON (xem liên kết này: https://parse.com/docs/rest/guide#queries). Dưới đây là một ví dụ:

    curl -X GET \ 
        -H "X-Parse-Application-Id: ${APPLICATION_ID}" \ 
        -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \ 
        -G \ 
        --data-urlencode 'where={"score":{"$gte":1000,"$lte":3000}}' \ 
        https://api.parse.com/1/classes/GameScore 
    
  • Nếu đó là một cái gì đó quá khó khăn để mô tả, bạn cũng có thể sử dụng một phương pháp POST và chỉ định truy vấn trong payload yêu cầu. ElasticSearch sử dụng cách tiếp cận này để hỗ trợ truy vấn của nó (xem liên kết này: https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html). Dưới đây là một ví dụ:

    $ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{ 
        "query": { 
         "bool" : { 
          "must" : { 
           "query_string" : { 
            "query" : "some query string here" 
           } 
          }, 
          "filter" : { 
           "term" : { "user" : "kimchy" } 
          } 
         } 
        } 
    } 
    ' 
    

Hy vọng nó giúp bạn, Thierry

+0

Cảm ơn bạn đã trả lời. Tôi thực sự thích giải pháp của parse.com, vì vậy tôi nghĩ rằng tôi sẽ cố gắng thực hiện điều đó. Nếu không có gì tốt hơn, tôi sẽ chấp nhận câu trả lời của bạn sau một vài ngày (sau khi tôi thực hiện kiểm tra). –

+0

Bạn được chào đón! Rõ ràng là việc sử dụng JSON để mô tả các truy vấn có lợi thế đặc biệt đối với các ứng dụng Node ;-) –

2

OK do đó, đây là Bạn có thể thêm + hoặc - để bao gồm hoặc loại trừ và một từ khóa bao gồm bộ lọc cho AND và OR

For excluding 
GET /users?name=-David,-Lennart 
For including 
GET /users?name=+Bossee 
For OR 
GET /users?name=+Bossee&age=22&inclusive=false 
For AND 
GET /users?name=+Bossee&age=22&inclusive=true 

Bằng cách này các API là rất trực quan, rất có thể đọc được cũng thực hiện công việc bạn muốn nó làm.

EDIT - câu hỏi rất rất khó khăn, tuy nhiên tôi sẽ làm điều đó theo cách này

GET /users?name=+Bossee&age=22&place=NewYork&inclusive=false,true 

Có nghĩa là mối quan hệ đầu tiên là không bao gồm - hay nói cách khác nó là HOẶC mối quan hệ thứ hai đã bao gồm - hoặc trong khác các từ là AND

Giải pháp là xem xét đánh giá là từ trái sang phải.

+0

Tôi không thích giải pháp này. Tại sao tôi nên thêm '+' khi đó là hành vi mặc định? 'Inslusive = true' có nghĩa là gì? Tôi đoán là nó có nghĩa là tôi muốn một 'hoặc' giữa các tham số truy vấn trước đây. Điều gì sẽ xảy ra nếu tôi muốn thể hiện cả 'và' và' hoặc' trong cùng một câu lệnh? Tôi có thể hiểu sai câu trả lời của bạn, trong trường hợp đó, hãy làm rõ. –

+0

Ký hiệu '+' là (đôi khi) được sử dụng để mã hóa một không gian vì vậy tôi sẽ không cho nó một ý nghĩa. Xem thêm [câu hỏi này] (http://stackoverflow.com/questions/1634271). – lefloh

+0

Nếu tôi xem xét '+' là hành vi mặc định và chỉ sử dụng '=' nó sẽ là ok. Câu hỏi còn lại vẫn là cách tôi thể hiện một cái gì đó như '(x == 1 || x == 2) && y == GURP' với giải pháp này. –

0

Hey nó dường như không thể nếu bạn đi cho queryparams ... Nếu đó là trường hợp có biểu thức tiên tiến đi cho PathParams vì vậy bạn sẽ có các biểu thức chính quy để lọc.

Nhưng để chỉ cho phép một tên cụ thể = "Bosse", bạn cần phải viết một regex nghiêm ngặt.

Thay vì lấy điểm cuối REST chỉ vì mục đích điều kiện, cho phép bất kỳ giá trị tên nào và sau đó bạn cần viết logic để kiểm tra thủ công trong chương trình.

+0

Tôi không nghĩ rằng tôi hiểu ý bạn là gì. Bạn có thể cho thấy một ví dụ? –

Các vấn đề liên quan