2013-04-08 18 views
42

Sto provando a creare un riposante API e sto faticando su come serializzare i dati JSON su un HTTP query string.Modo standardizzato per serializzare JSON per interrogare la stringa?

Ci sono un certo numero di argomenti obbligatori e facoltativi che devono essere trasmesso nella richiesta, ad esempio (rappresentato come oggetto JSON sotto):

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

Ho bisogno di supportare un numero diverso di clienti differenti così Sto cercando un modo standardizzato per convertire questo oggetto json in una stringa di query. Ce n'è uno, e come appare?

Un'altra alternativa è consentire agli utenti di passare semplicemente l'oggetto json nel corpo di un messaggio, ma ho letto che dovrei evitarlo (HTTP GET with request body).

Qualche idea?

Modifica di chiarimenti:

Listing come alcune lingue diverse codifica il dato oggetto JSON sopra:

  • jQuery utilizzando $.param:-colonne [] = nome &-colonne [] = colonna & -where [-or] [customer_id] = 1 & -where [-or] [servizi] = programma & -limit = 5 & ritorno = colonna
  • PHP utilizzando http_build_query:-colonne [0] = nome &-colonne [1] = colonna & -dove [-or] [customer_id] = 1 & -dove [-or] [servizi] = programma & -limit = 5 & ritorno = colonna
  • Perl usando URI::query_form: =-colonne name &-colonne = colonna & -dove = HASH (0x59d6eb8) & -limit = 5 & ritorno = colonna
  • Perl utilizzando complex_to_query: 0 =-colonne: nome & -colonne: 1 = colonna & -limit = 5 & -where.-or.customer_id = 1 & -where.-or.services = pianificazione & ritorno = colonna

jQuery e PHP è molto simile. Anche Perl usando complex_to_query è molto simile a loro. Ma nessuno ha lo stesso aspetto.

+0

perché non utilizzare solo le richieste POST? – akonsu

+1

controllare se questo aiuta, http://api.jquery.com/jQuery.param/ – Jubair

+6

@akonsu: Perché sto cercando di recuperare (GET) alcuni dati, non POST nuovi dati. – Andreas

risposta

38

Codifica URL (https://en.wikipedia.org/wiki/Percent-encoding) il testo JSON e inserirlo in un singolo parametro stringa di query. per esempio, se si desidera passare {"val": 1}:

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

Nota che se il tuo JSON diventa troppo lungo, allora si incorrere in un problema URL limitazione di lunghezza. Nel qual caso io userei POST con un corpo (sì, lo so, l'invio di un POST quando si vuole recuperare qualcosa non è "puro" e non si adatta bene al paradigma REST, ma nessuno dei due è la query basata su JSON specifica del dominio linguaggio).

+1

Sì, probabilmente è un modo per ottenere questo risultato. Dubito che mi imbatterò nel problema della limitazione della lunghezza dell'URL. Mi chiedo che cosa è meglio: 1) Passa un singolo parametro json 2) Usa POST (anche se stiamo GETING) o 3) Usa GET con un corpo del messaggio. Forse supporto sia 1) che 3)? – Andreas

+1

A proposito, la "query langague basata su JSON" che utilizzo proviene da SQL :: Abstract: Altro: http://search.cpan.org/~dami/SQL-Abstract-More-1.11/lib/ SQL/Abstract/More.pm – Andreas

+1

Implementerei 1) e 2). Vorrei usare 1) il più possibile e quando url è troppo lungo userò il 'POST'. Un 'GET' con un corpo che non mi piace perché è strano, sebbene sia tecnicamente possibile. – akonsu

4

Un'altra opzione potrebbe essere node-querystring. Utilizza anche uno schema simile a quelli che hai elencato finora.

È disponibile sia in npm sia in bower, motivo per cui l'ho utilizzato.

2

ne dite di provare questo inviando loro come segue:

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

ho provato con un REST client enter image description here

E sul lato server (rubino con Sinatra) ho controllato i params, dà esattamente quello che vuoi :-)

enter image description here

Problemi correlati