2009-10-20 6 views
7

Je développe actuellement une API pour mon application sur RoRrequest.format retour */*

À titre d'exemple, je crée une XML, chargé avec toutes les informations que je dois créer l'objet, disons un personne, et en utilisant Curl je l'ai soumis ma demande

Je suis en mesure d'appeler exactement créer une action que je veux du contrôleur et les params de hachage de l'objet sont transmises correctement

Mais maintenant je dois appliquer un comportement différent si la demande a été faite ou non avec XML, ce qui me dérange est pourquoi dans le contrôleur request.format donne */*.

Des indices?

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 

Répondre

14

*/* signifie que l'agent utilisateur accepte tous les formats et ne se soucie pas ce format que vous lui donnez. Je crois que Safari fait cela, entre autres. Par défaut, curl envoie un en-tête Accept de */*.

Voici une décharge des têtes curl envoie par défaut:

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: 

Cependant, dans ce cas, il semble que vous voulez renvoyer XML si la charge utile envoyé était XML? Si c'est le cas, vous souhaitez vérifier directement l'en-tête Content-Type de la requête. c'est-à-dire, request.content_type est la méthode que vous voulez.

Addenda: Je pensais un peu plus à ce sujet, et je pense que la meilleure approche est d'abord vérifier request.format et seulement si cela est peu concluante vérification request.content_type. Essentiellement, la spécification HTTP permet aux clients d'indiquer aux serveurs que "Je vous donne du XML, mais je veux récupérer JSON". L'en-tête Accept est la façon dont les clients vous disent ce qu'ils veulent récupérer, et si quelqu'un l'envoie réellement, vous devriez l'honorer. N'utilisez le type de contenu de la requête comme indicateur que si le client n'a pas spécifié.

+0

navigateur? Hmm, maintenant vous m'avez confus. J'envoie la demande via une ligne de commande, le type de navigateur ne devrait pas être un problème –

+0

Ouais, désolé ... Je vais clarifier. –

+0

Maintenant, il est plus logique =) merci –

0

*/* signifie simplement que tous les types MIME sont acceptés.

Si vous examinez le code de la méthode request.format, le type MIME est déterminé par l'extension du fichier ou, si ce n'est pas le cas, par la valeur de l'en-tête HTTP Accept. Vous devez donc passer Curl un fichier XML enregistré sur le disque, ou obtenir Curl pour définir l'en-tête Accept sur un type MIME XML (par exemple, text/xml) lors de la demande à votre API.

+0

Pourquoi le vote à la baisse? –

+0

Ce n'est pas correct. Il ** passe ** un fichier XML. La charge utile de la requête n'a aucun effet sur request.format. Vous devez le détecter manuellement. La méthode request.format utilise le composant path de l'URI demandé pour obtenir le format. Donc, si votre URI se termine par .xml, il obtiendra la valeur attendue. Toutefois, si l'objectif est de fournir un seul point de terminaison API qui gère plusieurs types de contenu, cela n'aidera pas. –

+0

Im actuellement en utilisant le type de contenu comme application/xml, changé en texte/xml et il produit toujours le même request.format (*/*) Le fichier passé à curl est enregistré sur le disque –