2009-10-20 13 views
7

Sono attualmente in via di sviluppo un'API per la mia applicazione su RoRrequest.format ritorno */*

Per fare un esempio, ho creato un po 'di XML, caricato con tutte le informazioni che ho bisogno di creare l'oggetto, diciamo un persona, e l'utilizzo di Curl ho presentato a mia domanda

sono in grado di chiamare esattamente l'azione che voglio creare dal controller e le params hash dell'oggetto sono passati correttamente

Ma ora ho bisogno di applicare un comportamento diverso se è stata fatta richiesta o meno con XML, ciò che mi infastidisce è il motivo per cui nel controller request.format corrisponde a */*.

Eventuali indizi?

curl -v -H "Content-Type: application/xml; charset=utf-8" --data-ascii @client.xml http://foo.com:3000/clients?api_key=xxx 

def create 
    logger.debug request.format # produces "*/*" 
    if request.format.xml? 
    # never gets here 
    end 
end 

risposta

14

*/* significa che l'utente-agente accetta tutti i formati e non si cura quale formato si dà. Credo che Safari faccia questo, tra gli altri. Per impostazione predefinita, curl invia un'intestazione Accept di */*.

Ecco un dump delle intestazioni curl manda di default:

User-Agent: curl/7.18.1 (i386-apple-darwin9.6.0) libcurl/7.18.1 zlib/1.2.3 
Host: example.com 
Accept: */* 
Content-Type: 

Tuttavia, in questo caso, sembra che si desidera inviare di nuovo XML se il carico utile inviato era XML? In questo caso, si desidera controllare direttamente l'intestazione Content-Type della richiesta. Ad esempio, request.content_type è il metodo che desideri.

Addenda: ho pensato un po 'di più su questo, e penso che l'approccio migliore è quello di controllare prima request.format e solo se questo è inconcludente controllo request.content_type. Essenzialmente, la specifica HTTP prevede che i client siano in grado di dire ai server che "Ti sto dando XML, ma voglio che JSON venga restituito". L'intestazione Accept è il modo in cui i clienti ti dicono ciò che vogliono e, se qualcuno lo invia, dovresti onorarlo. Utilizza il tipo di contenuto della richiesta come suggerimento solo se il cliente non lo specifica.

+0

browser? Hmm, ora mi hai confuso. Sto inviando la richiesta tramite una linea di comando, il tipo di browser non dovrebbe essere un problema –

+0

Sì, mi dispiace ... chiarirò. –

+0

Ora ha più senso =) grazie –

0

*/* significa semplicemente che tutti i tipi MIME sono accettati.

Guardando il codice per il metodo request.format, il tipo MIME è determinato dall'estensione del file o, se questo non è presente, dal valore dell'intestazione HTTP Accept. Quindi è necessario passare a Curl un file XML salvato su disco o ottenere Curl per impostare l'intestazione Accept su un tipo MIME XML (ad esempio text/xml) quando effettua la richiesta all'API.

+0

Perché il voto negativo? –

+0

Questo non è corretto. Lui ** sta ** passando un file XML. Il carico utile della richiesta non ha alcun effetto su request.format. Devi rilevarlo manualmente. Il metodo request.format utilizza il componente path dell'URI richiesto per ottenere il formato. Quindi se il tuo URI termina in .xml, otterrà il valore atteso. Tuttavia, se l'obiettivo è quello di fornire un singolo endpoint API che gestisca più Content-Types, ciò non sarà di aiuto. –

+0

Attualmente im usando content-type come application/xml, modificato in text/xml e produce ancora la stessa request.format (*/*) Il file passato a curl viene salvato sul disco –