2010-04-10 18 views
7

Sto lavorando su un'API che accetta dati da client remoti, alcuni dei quali in cui la chiave in un POST HTTP funziona quasi come una matrice. In inglese, questo significa dire che ho una risorsa sul mio server chiamata "class". Una classe in questo senso, è il tipo in cui uno studente si siede e un insegnante educa. Quando l'utente invia un POST HTTP per creare una nuova classe per la propria applicazione, molte coppie di valori chiave assomigliano a:Coppie chiave/valore multiple in POST HTTP dove la chiave è lo stesso nome

student_name : Bob Smith
student_name: Jane Smith
student_name: Chris Smith

Qual è il modo migliore per gestire questa sia sul lato client (diciamo che il cliente è cURL o ActiveResource, qualunque cosa ..) e che cosa è un modo decente di gestirlo sul lato server se il mio server è un'app Ruby on Rails? È necessario un modo per consentire più chiavi con lo stesso nome e senza alcun conflitto di spazio dei nomi o perdita di dati.

Il mio requisito deve essere che i dati POST siano coppie chiave/valore codificate.

risposta

20

Ci sono due modi per gestire questo, e dipenderà dall'architettura lato client come si fa a farlo, come gli standard HTTP non rendono la situazione asciutta.

Tradizionalmente, le richieste HTTP utilizzavano semplicemente la stessa chiave per valori ripetuti e lasciavano all'architettura client la realizzazione di ciò che stava accadendo. Per esempio, si potrebbe avere una richiesta POST con i seguenti valori:

student_name=Bob+Smith&student_name=Jane+Smith&student_name=Chris+Smith 

Quando l'architettura di ricezione ottenuto che stringa, avrebbe dovuto rendersi conto che ci sono stati più chiavi di student_name e agire di conseguenza. Di solito è implementato in modo tale che se si ha una singola chiave, viene creato un valore scalare e se si hanno multipli della stessa chiave, i valori vengono messi in una matrice.

Le architetture client-side moderne come PHP e Rails utilizzano tuttavia una sintassi diversa. Qualsiasi chiave che si desidera essere letto come un array ottiene parentesi quadre aggiunti, come questo:

architettura
student_name[]=Bob+Smith&student_name[]=Jane+Smith&student_name[]=Chris+Smith 

Il ricevente creerà una struttura di matrice denominata "student_name" senza le parentesi. La sintassi della parentesi quadra risolve il problema di non essere in grado di inviare una matrice con un solo valore, che non può essere gestito con il metodo "tradizionale".

Poiché si utilizza Rails, la sintassi della parentesi quadra sarebbe la strada da percorrere. Se pensi di poter cambiare architetture lato server o di voler distribuire il tuo codice, puoi esaminare altri metodi agnostici, come la codifica JSON della stringa inviata, che aggiunge un sovraccarico, ma potrebbe essere utile se si tratta di una situazione che ti aspetti devono gestire

C'è un bel post su tutto questo nel contesto di JQuery Ajax parameters here.

+2

+1. Il parser params delle rota sovrascrive il valore a meno che tu non abbia il [] presente. – Tilendor

0

Invia i tuoi dati come XML o JSON e analizza tutto ciò di cui hai bisogno.

+0

Avrei dovuto precisare sopra che ho bisogno di supportare coppie chiave/valore urlencoded come un tipico browser lo gestisce. Modificherò la mia domanda per riflettere questo. – randombits

Problemi correlati