2008-12-17 21 views
52

Estoy buscando un diseño tranquilo y me gustaría utilizar los métodos HTTP (POST, GET, ...) y los encabezados HTTP tanto como sea posible. Ya descubrí que los métodos HTTP PUT y DELETE no son compatibles desde el navegador.¿Puedo cambiar los encabezados de la solicitud HTTP enviada por el navegador?

Ahora estoy buscando obtener representaciones diferentes del mismo recurso y me gustaría hacer esto cambiando el encabezado Accept de la solicitud. Dependiendo de este encabezado Accept, el servidor puede servir una vista diferente en el mismo recurso.

El problema es que no encontré la manera de decirle a mi navegador que cambie este encabezado.

La etiqueta tiene un <a..>type attribute, que puede tener un tipo de MIME, parecía un buen candidato, pero la cabecera sigue siendo el navegador por defecto (en Firefox se puede cambiar en about:config con la tecla network.http.accept.default).

+0

Te escucho. Sería genial codificar algunos encabezados y en la pestaña del navegador simplemente visita las URL para probar tu código. No quiero una interfaz separada en toda regla, como la aplicación Chrome Postman. –

+0

Esta extensión funciona muy bien para mí: https://chrome.google.com/webstore/detail/modify-headers-for-google/innpjfdalfhpcoinfnehdnbkglpmogdi?hl=en-US –

Respuesta

9

no creo que es posible hacerlo en la forma en que están tratando de hacerlo.

La indicación del formato de datos aceptado generalmente se realiza agregando la extensión al nombre del recurso. Por lo tanto, si usted tiene recurso como

/resources/resource 

y GET /resources/resource devuelve su representación HTML, para indicar que desea que su representación XML en lugar, puede utilizar siguiente patrón:

/resources/resource.xml 

Usted tiene que hacer el aceptada la magia de determinación del tipo de contenido en el lado del servidor, entonces.

O use Javascript como sugiere James.

+0

-1 ver respuesta de Shonzilla – mb14

1

¡Utilice algunos javascript!

 
xmlhttp=new XMLHttpRequest(); 
xmlhttp.open('PUT',http://www.mydomain.org/documents/standards/browsers/supportlist) 
xmlhttp.send("page content goes here"); 
+0

Gracias por la respuesta rápida, pero la pregunta es sobre cambiar los encabezados predeterminados enviar en la solicitud HTTP. En particular, el encabezado Aceptar. – JeroenWyseur

+0

En una nota lateral, la especificación (http://www.w3.org/TR/2006/WD-XMLHttpRequest-20060405/#dfn-open) no dice nada sobre PUT y DELETE, ver la nota editorial. Además, no hay ningún envío en ese caso, lo que es bueno es una interfaz de usuario ajaxificada, pero de lo contrario no. – JeroenWyseur

35

Estoy parcialmente en desacuerdo con la sugerencia de Milán de incorporar la representación solicitada en el URI.

Si de todos modos es posible, URIs deben única ser utilizados por los recursos de direccionamiento y no para la construcción de túneles HTTP métodos/verbos. Con el tiempo, la acción específica de negocios (editar, bloqueo, etc.) podría ser embebido en el URI si crear (POST) o actualización (PUT) solos no sirven al propósito:

 
POST http://shonzilla.com/orders/08/165;edit 

En el caso de solicitar un particular, La representación en URI necesitaría interrumpir el diseño de su URI haciéndolo eventualmente más feo, mezclando dos conceptos REST diferentes en el mismo lugar (es decir, URI) y dificultando el procesamiento genérico de solicitudes en el lado del servidor. Lo que Milán está sugiriendo y muchos están haciendo lo mismo, incl. Flickr, es exactamente esto.

En cambio, un enfoque más tranquilo sería usando un lugar separado para codificar la representación preferida utilizando Accept cabecera HTTP que se utiliza para la negociación de contenidos donde el cliente le dice al servidor qué tipos de contenido que puede manejar/proceso y trata de servidores para cumplir con la solicitud del cliente. Este enfoque es parte de HTTP 1.1 standard, compatible con el software y también es compatible con navegadores web.

Compare esto:

 
GET /orders/08/165.xml HTTP/1.1 
or 
GET /orders/08/165&format=xml HTTP/1.1 

a esto:

 
GET /orders/08/165 HTTP/1.1 
Accept: application/xml 

Desde un navegador web puede solicitar cualquier tipo de contenido mediante el uso de setRequestHeader método de XMLHttpRequest objeto. Por ejemplo:

 
function getOrder(year, yearlyOrderId, contentType) { 
var client = new XMLHttpRequest(); 
client.open("GET", "/order/" + year + "/" + yearlyOrderId); 
client.setRequestHeader("Accept", contentType); 
client.send(orderDetails); 
} 

Para resumir: la dirección, es decir, el URI de un recurso debe ser independiente de su representación y XMLHttpRequest.setRequestHeader método le permite solicitar cualquier representación mediante el encabezado HTTP Accept.

¡Salud!
Shonzilla

+3

Una desventaja es que es imposible (hiper) vincular directamente para decir el recurso 'XML'. Para algunas aplicaciones esto podría ser necesario. Por ejemplo, en OpenCPU, los gráficos se pueden recuperar en formato 'PNG',' PDF' o 'SVG'. Sin embargo, sería imposible incrustar la imagen 'PNG' en una página HTML si se requiere un encabezado' Accept' para la recuperación. – Jeroen

+2

@Jeroen: si el navegador admite SVG mejor que PNG, debe enviar un encabezado Aceptar con SVG ponderado más alto que PNG y responder con SVG. Para navegadores que no son compatibles con SVG, su encabezado Aceptar no contendría application/svg + xml para que el servidor envíe de vuelta el archivo PNG. Si por alguna razón considera que la versión PNG tiene una mayor fidelidad que la versión PDF/SVG (por ejemplo, fotografía vectorizada), entonces el servidor debe establecer un mayor peso para la versión PNG para que se devuelva si el navegador admite todo tres por igual. Así es como se supone que la negociación de contenido funciona. –

+0

Esta respuesta casi me convenció pero luego vi [esta respuesta] (http://programmers.stackexchange.com/a/251555/216886) sobre un tema similar y tiendo a estar de acuerdo con esto último. En muchos (o la mayoría de) casos, la información de formato es realmente parte de la identidad del recurso y puede (o debería) incluirse en el URI para evitar resultados inesperados después de compartir dicho URI entre diferentes clientes. En estos casos, el encabezado Acepta debe jugar un papel secundario. Es importante distinguir estos casos. –

10

Estaba buscando hacer exactamente lo mismo (servicio web RESTful), y me encontré con este complemento de Firefox, que te permite modificar los encabezados de aceptación (en realidad, los encabezados de solicitud) para las solicitudes. Funciona perfectamente

https://addons.mozilla.org/en-US/firefox/addon/967/

+0

gracias esto es exactamente lo que necesitaba. – lathomas64

+0

Chris, ¿qué pasa si la extensión tiene un error, o la extensión no funciona con la versión del navegador que desea o si los desarrolladores simplemente detuvieron la actualización de las extensiones? Veo que esto sucede para la mayoría, si no para todas las extensiones de Firefox que te permiten agregar/modificar encabezados de solicitud. Los complementos pueden ser fáciles y productivos, pero no funcionarán cuando haya problemas con las extensiones. – testerjoe2

Cuestiones relacionadas