rest - chrome - ¿Puedo cambiar los encabezados de la solicitud HTTP enviada por el navegador?
rest header json (4)
¡Usa algo de javascript!
xmlhttp=new XMLHttpRequest(); xmlhttp.open(''PUT'',http://www.mydomain.org/documents/standards/browsers/supportlist) xmlhttp.send("page content goes here");
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.
Ahora estoy buscando obtener representaciones diferentes del mismo recurso y me gustaría hacerlo 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 <a..>
..> tiene un atributo de tipo , que puede tener un tipo mime, parecía un buen candidato, pero el encabezado aún era el predeterminado del navegador (en Firefox puede cambiarse en about:config
con la network.http.accept.default
clave network.http.accept.default
).
En parte estoy en desacuerdo con la sugerencia de Milán de incluir la representación solicitada en el URI.
Si es posible, los URI solo deben utilizarse para direccionar recursos y no para tunelizar métodos / verbos HTTP. Eventualmente, la acción comercial específica (edición, bloqueo, etc.) podría incorporarse en el URI si crear (POST) o actualizar (PUT) solo no cumple el propósito:
POST http://shonzilla.com/orders/08/165;edit
En el caso de solicitar una representación particular en URI, tendría que interrumpir el diseño de su URI haciéndolo finalmente 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 su lugar, un enfoque más RESTful usaría un lugar separado para codificar la representación preferida mediante el uso del encabezado Accept
HTTP, que se usa para la negociación de contenido donde el cliente le dice al servidor qué tipos de contenido puede manejar / procesar y el servidor intenta satisfacer la solicitud del cliente. Este enfoque es parte del estándar HTTP 1.1 , compatible con el software y también es compatible con los 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 utilizando el método setRequestHeader
del objeto XMLHttpRequest
. 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 el método XMLHttpRequest.setRequestHeader
permite solicitar cualquier representación mediante el encabezado Accept
HTTP.
¡Aclamaciones!
Shonzilla
Estaba buscando hacer exactamente lo mismo (servicio web RESTful), y me encontré con este complemento de Firefox, que le permite modificar los encabezados de aceptación (en realidad, los encabezados de solicitud) para las solicitudes. Funciona perfectamente
No creo que sea posible en la forma en que intentas hacerlo.
La indicación del formato de datos aceptado generalmente se hace agregando la extensión al nombre del recurso. Entonces, si tiene recursos como
/resources/resource
y GET /resources/resource
devuelve su representación HTML, para indicar que desea su representación XML en su lugar, puede usar el siguiente patrón:
/resources/resource.xml
Tienes que hacer la magia de determinación del tipo de contenido aceptado en el lado del servidor, entonces.
O use Javascript como sugiere James.