2009-10-20 31 views
7

Actualmente estoy desarrollando una API para mi aplicación en RoRrequest.format regresar */*

Como ejemplo, he creado un poco de XML, cargado con toda la información que necesito para crear el objeto, digamos que una persona, y el uso de Curl me presentó a mi solicitud

soy capaz de llamar exactamente el crear una acción que quiero del controlador y los parametros de hash del objeto se pasan correctamente

Pero ahora necesito aplicar un comportamiento diferente si la solicitud se realizó o no con XML, lo que me molesta es por qué en el controlador request.format da */*.

¿Alguna pista?

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 

Respuesta

14

*/* significa que el agente de usuario acepta todos los formatos y no le importa qué formato que le des. Creo que Safari hace esto, entre otros. De forma predeterminada, curl envía un encabezado Aceptar de */*.

Aquí es un volcado de las cabeceras curl envía por defecto:

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: 

Sin embargo, en este caso, parece que quiere devolver XML si la carga útil enviada a usted era XML? Si ese es el caso, quiere verificar directamente el encabezado Content-Type de la solicitud. es decir, request.content_type es el método que desea.

Adenda: pensé un poco más sobre esto, y creo que el mejor enfoque es comprobar primero request.format y sólo si es cheque concluyentes request.content_type. Básicamente, la especificación HTTP permite a los clientes decirles a los servidores que "te estoy dando XML, pero quiero que JSON regrese". El encabezado Aceptar es la forma en que los clientes le dicen lo que quieren y, si alguien realmente lo envía, debe cumplirlo. Solo use el tipo de contenido de la solicitud como una sugerencia si el cliente no especificó.

+0

navegador? Hmm, ahora me tienes confundido. Estoy enviando la solicitud a través de una línea de comandos, el tipo de navegador no debería ser un problema –

+0

Sí, lo siento ... Lo aclararé. –

+0

Ahora tiene más sentido =) gracias –

0

*/* simplemente significa que se aceptan todos los tipos MIME.

Al mirar el código para el método request.format, el tipo MIME viene determinado por la extensión del archivo, o si no está presente por el valor del encabezado HTTP Accept. Por lo tanto, debe pasar Curl un archivo XML guardado en el disco u obtener Curl para establecer el encabezado Aceptar en un tipo XML MIME (por ejemplo, text/xml) cuando realiza la solicitud a su API.

+0

¿Por qué votar abajo? –

+0

Esto no es correcto. Él ** está ** pasando un archivo XML. La carga útil de la solicitud no tiene ningún efecto en request.format. Tienes que detectar eso manualmente. El método request.format usa el componente de ruta del URI solicitado para obtener el formato. Entonces, si su URI termina en .xml, obtendrá el valor esperado. Sin embargo, si el objetivo es proporcionar un solo punto final de API que maneje múltiples tipos de contenido, eso no ayudará. –

+0

Actualmente estoy usando content-type como application/xml, cambiado a text/xml y todavía produce el mismo request.format (*/*) El archivo pasado a curl se guarda en el disco –

Cuestiones relacionadas