Cuando tengo este código
$.ajax({
type: 'POST',
//contentType: "application/json",
url: 'http://localhost:16329/Hello',
data: { name: 'norm' },
dataType: 'json'
});
en Fiddler puedo ver la siguiente solicitud sin procesar
POST http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:14693/WebSite1/index.html
Content-Length: 9
Origin: http://localhost:14693
Pragma: no-cache
Cache-Control: no-cache
name=norm
Pero lo que estoy intentando es establecer el tipo de contenido de application / x-www-form-urlencoded a application / json . Pero este codigo
$.ajax({
type: "POST",
contentType: "application/json",
url: 'http://localhost:16329/Hello',
data: { name: 'norm' },
dataType: "json"
});
Genera una solicitud extraña (que puedo ver en Fiddler)
OPTIONS http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost:14693
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache
¿Porqué es eso? ¿Cuáles son las OPCIONES cuando debería ser POST allí? ¿Y dónde está mi tipo de contenido establecido en application / json? Y los parámetros de solicitud se han ido por alguna razón.
ACTUALIZACIÓN 1
En el lado del servidor, tengo un servicio RESTful realmente simple.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class RestfulService : IRestfulService
{
[WebInvoke(
Method = "POST",
UriTemplate = "Hello",
ResponseFormat = WebMessageFormat.Json)]
public string HelloWorld(string name)
{
return "hello, " + name;
}
}
Pero por alguna razón no puedo llamar a este método con parámetros.
ACTUALIZACIÓN 2
Perdón por no responder tanto tiempo.
Agregué estos encabezados a la respuesta de mi servidor
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST, GET, OPTIONS
No ayudó, tengo un error de Método no permitido del servidor.
Esto es lo que dice mi violinista
Entonces, ahora puedo estar seguro de que mi servidor acepta POST, GET, OPTIONS (si los encabezados de respuesta funcionan como espero). Pero, ¿por qué "Método no permitido"?
En la respuesta de WebView del servidor (puede ver la respuesta sin procesar en la imagen de arriba) se ve así
fuente
Respuestas:
Parecería que eliminar
http://
de la opción de URL garantiza que se envíe el encabezado HTTP POST correcto.No creo que necesite calificar completamente el nombre del host, solo use una URL relativa como se muestra a continuación.
Un ejemplo mío que funciona:
Posiblemente relacionado: jQuery $ .ajax (), $ .post enviando "OPTIONS" como REQUEST_METHOD en Firefox
Editar: Después de investigar un poco más, descubrí que el encabezado OPTIONS se usa para averiguar si la solicitud del dominio de origen está permitida. Usando Fiddler, agregué lo siguiente a los encabezados de respuesta de mi servidor.
Una vez que el navegador recibió esta respuesta, envió la solicitud POST correcta con datos json. Parecería que el tipo de contenido con código de URL de formulario predeterminado se considera seguro y, por lo tanto, no se somete a las comprobaciones adicionales entre dominios.
Parece que deberá agregar los encabezados mencionados anteriormente a la respuesta de su servidor a la solicitud de OPCIONES. Por supuesto, debe configurarlos para permitir solicitudes de dominios específicos en lugar de todos.
Usé el siguiente jQuery para probar esto.
Referencias:
fuente
Puedo mostrarte como lo usé
fuente
Entonces, todo lo que necesita hacer para que esto funcione es agregar:
como un campo para su solicitud de publicación y funcionará.
fuente
type: "POST"
, está enviandoOPTIONS
.Reconocí esas pantallas, estoy usando CodeFluentEntities y tengo una solución que también funcionó para mí.
Estoy usando esa construcción:
como puedes ver, si uso
o
Todo funciona bien.
No estoy 100% seguro de que sea todo lo que necesitas, porque también he cambiado los encabezados.
fuente
Si usa esto:
AJAX no enviará parámetros GET o POST al servidor ... no sé por qué.
Me tomó horas aprenderlo hoy.
Solo usa:
fuente
Encontré la solución para este problema aquí . No olvide permitir OPCIONES de verbo en el controlador de servicio de la aplicación IIS.
Funciona bien. Gracias André Pedroso. :-)
fuente
Tuve el mismo problema. Estoy ejecutando una aplicación Java rest en un servidor jboss. Pero creo que la solución es similar en una aplicación web ASP .NET.
Firefox realiza una llamada previa a su servidor / URL de descanso para verificar qué opciones están permitidas. Esa es la solicitud de "OPCIONES" a la que su servidor no responde en consecuencia. Si esta llamada de OPCIONES se responde correctamente, se realiza una segunda llamada, que es la solicitud "POST" real con contenido json.
Esto solo ocurre cuando se realiza una llamada entre dominios. En su caso, llamar a '
http://localhost:16329/Hello
' en lugar de llamar a una ruta de URL bajo el mismo dominio '/ Hello'Si tiene la intención de realizar una llamada entre dominios, debe mejorar su clase de servicio de descanso con un método anotado que admite una solicitud http "OPCIONES". Esta es la implementación de Java correspondiente:
Así que supongo que en .NET debe agregar un método adicional anotado con
donde se establecen los siguientes encabezados
fuente
Obtuve la solución para enviar los datos JSON por solicitud POST a través de jquery ajax. Usé el siguiente código
Usé
'Content-Type': 'text/plain'
en el encabezado para enviar los datos json sin procesar.Porque si usamos
Content-Type: 'application/json'
los métodos de solicitud convertidos a OPCIÓN, pero usandoContent-Type: 'test/plain'
el método no se convierte y permanece como POST. Espero que esto ayude a alguien.fuente
Hola, estas dos líneas funcionaron para mí.
Gracias, Prashant
fuente