2013-04-08 32 views
42

Tôi đang cố gắng xây dựng một số API yên tĩnh và tôi đang cố gắng cách sắp xếp dữ liệu JSON theo số HTTP query string.Cách chuẩn hóa để tuần tự hóa JSON thành chuỗi truy vấn?

Có một số các đối số bắt buộc và không bắt buộc mà cần phải được thông qua trong yêu cầu, ví dụ như (biểu diễn dưới dạng một đối tượng JSON dưới đây):

{ 
    "-columns" : [ 
     "name", 
     "column" 
    ], 
    "-where" : { 
     "-or" : { 
     "customer_id" : 1, 
     "services" : "schedule" 
     } 
    }, 
    "-limit" : 5, 
    "return" : "table" 
} 

tôi cần phải hỗ trợ một số khác nhau của khách hàng khác nhau để Tôi đang tìm một cách tiêu chuẩn hóa để chuyển đổi đối tượng json này thành một chuỗi truy vấn. Có cái nào không, và nó trông như thế nào?

Một giải pháp thay thế khác là cho phép người dùng chỉ cần truyền dọc đối tượng json trong nội dung thư, nhưng tôi đọc rằng tôi nên tránh nó (HTTP GET with request body).

Mọi suy nghĩ?

Chỉnh sửa để làm rõ:

Bảng liệt kê như thế nào một số ngôn ngữ khác nhau mã hóa các đối tượng json đưa ra ở trên:

  • jQuery sử dụng $.param: -columns [] = tên & -columns [] = cột & -where [-or] [customer_id] = 1 & -where [-or] [services] = schedule & -limit = 5 & return = column
  • PHP sử dụng http_build_query: -columns [0] = tên & -columns [1] = cột & -where [-Hoặc] [customer_id] = 1 & -where [-Hoặc] [Dịch vụ] = lịch & -Giới hạn = 5 & lợi nhuận = cột
  • Perl sử dụng URI::query_form: -columns = tên & -columns = cột & -where = HASH (0x59d6eb8) & -Giới hạn = 5 & trở lại = cột
  • Perl sử dụng complex_to_query: -columns: 0 = tên & -columns: 1 = cột & -limit = 5 & -where.-or.customer_id = 1 & -where.-or.services = lịch & trở lại = cột

jQuery và PHP là rất giống nhau. Perl sử dụng complex_to_query cũng khá giống với chúng. Nhưng không ai nhìn giống hệt nhau.

+0

tại sao không chỉ sử dụng yêu cầu POST? – akonsu

+1

kiểm tra xem điều này có hữu ích không, http://api.jquery.com/jQuery.param/ – Jubair

+6

@akonsu: Bởi vì tôi đang cố gắng tìm nạp (GET) một số dữ liệu chứ không phải POST dữ liệu mới. – Andreas

Trả lời

38

Mã hóa URL (https://en.wikipedia.org/wiki/Percent-encoding) văn bản JSON của bạn và đặt nó vào một tham số chuỗi truy vấn đơn lẻ. ví dụ: nếu bạn muốn vượt qua {"val": 1}:

mysite.com/path?json=%7B%22val%22%3A%201%7D 

Lưu ý rằng nếu JSON của bạn quá dài thì bạn sẽ gặp sự cố giới hạn độ dài URL. Trong trường hợp này, tôi sẽ sử dụng POST với nội dung (vâng, tôi biết, gửi POST khi bạn muốn tìm nạp nội dung nào đó không phải là "thuần túy" và không phù hợp với mô hình REST, nhưng không phải là truy vấn dựa trên JSON cụ thể trên miền của bạn ngôn ngữ).

+1

Yea có lẽ là một cách để thực hiện việc này. Tôi nghi ngờ rằng tôi sẽ chạy vào vấn đề giới hạn độ dài URL. Tôi tự hỏi điều gì là tốt nhất: 1) Vượt qua một tham số json đơn 2) Sử dụng POST (mặc dù chúng tôi đang BẮT ĐẦU) hoặc 3) Sử dụng GET với nội dung thư. Có lẽ hỗ trợ cả 1) và 3)? – Andreas

+1

Nhân tiện, "ngôn ngữ truy vấn dựa trên JSON" tôi đang sử dụng đến từ SQL :: Abstract :: More: http://search.cpan.org/~dami/SQL-Abstract-More-1.11/lib/ SQL/Abstract/More.pm – Andreas

+1

Tôi sẽ triển khai 1) và 2). Tôi sẽ sử dụng 1) càng nhiều càng tốt và khi url được quá lâu tôi sẽ sử dụng 'POST'. Một 'GET' với một cơ thể tôi không thích bởi vì nó là lạ, mặc dù nó là kỹ thuật có thể. – akonsu

4

Tùy chọn khác có thể là node-querystring. Nó cũng sử dụng một lược đồ tương tự cho những cái bạn đã liệt kê.

Tính năng này có sẵn ở cả hai số npmbower, đó là lý do tôi sử dụng nó.

2

Làm thế nào về bạn cố gắng này gửi chúng như sau:

http://example.com/api/wtf? 
[-columns][]=name& 
[-columns][]=column& 
[-where][-or][customer_id]=1& 
[-where][-or][services]=schedule& 
[-limit]=5& 
[return]=table& 

Tôi đã thử với một REST khách hàng enter image description here

Và ở phía máy chủ (Ruby với Sinatra) Tôi đã kiểm tra các params, nó mang lại cho tôi chính xác những gì bạn muốn. :-)

enter image description here

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