14
respostas

Ajax content type

Bom dia, gostaria de uma ajuda de vocês. Tenho uma API a qual preciso chamar via POST, passando no body como data uma informação igual a este:

              {   
                       "dsLoginRequest" :     
                        {
                                       "m_email" : "xxx",       
                                       "m_senha" : "xxxx",             
                                       "m_nom_programa" : "xxx",
                                       "player_id" : "xxxx" 
                        }
               }

Testei pela ferramenta Postman do Google, e dentro dela tem a opção de enviar o body no formato "raw"( que é o meu caso) . Porem pelo jquery usando

$.post()

Ele por padrão manda por form data, como alterar para enviar no formato raw, na documentação não achei nada sobre esse formato.

14 respostas

Bruno, faz o seguinte, insere este seu json em uma variável e utiliza este código.

$.ajax('url',{ 'data': JSON.stringify(variavelComSeuJson), 'type': 'POST', 'processData': false, 'contentType': 'application/json' });

Veja se funciona.

Olá Carlos, obrigado pelo retorno.

Acabei de fazer dessa maneira e deu o seguinte erro:

"403 Header not supported"

O engraçado é que o requeste method aparece como OPTIONS, porem coloquei o type como "POST"

O que pode ser?

Bruno,

achei este exemplo aqui, veja o que acontece.

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" }, { "position": "235.1944023323615", "markerPosition": "19" }, { "position": "42.5978231292517", "markerPosition": "-3" }];

$.ajax({ type: "POST", url: "/webservices/PodcastService.asmx/CreateMarkers", // The key needs to match your method's input parameter (case-sensitive). data: JSON.stringify({ Markers: markers }), contentType: "application/json; charset=utf-8", dataType: "json", success: function(data){alert(data);}, failure: function(errMsg) { alert(errMsg); } });

Carlos,

Deu o mesmo problema, pesquisei sobre esse erro 403, e percebi que tem algo sobre cross domain, porem no servidor já esta habilitado o CORS para qualquer dominio, será que no ajax precisa especificar algo?

Para resolver problema de crossdomais você pode utilizar o jsonp ao invés de json

O problema que o jsonp é para GET, no meu caso é POST =/

Bruno, uma pena eu não ter conseguido ajudar muito. Espero que vc consiga a resposta correta.

Carlos, tudo bem, eu que te agradeço pela sua ajuda, obrigado mesmo, assim que eu conseguir resolver o problema te aviso por aqui.

bom final de semana :)

Oi Bruno,

O erro "403 Header not supported" normalmente significa que o servidor não aceita um dos Headers que você está enviando, provavelmente o header de content-type com o valor de application/json

Eu não sei com está configurado o seu servidor, mas como ele aceitou a requisição com o RAW do postman tente enviar o texto como text/plain para ver se ele aceita.

Tente assim:

$.ajax('SUA URL AQUI',
    { 'data': JSON.stringify(variavelComSeuJson),
     'method': 'POST',
    'contentType': 'text/plain'
    });

Boa tarde Douglas,

Fiz o ajuste sugerido por você e parou o erro 403, porem o retorno do serviço vem vazio, pois ele espera o formato application/json.

No servidor o serviço já está com o 'Access-Control-Allow-Origin' habilitado para * porém o erro persiste.

=/

Oi Bruno,

Tudo bem , já que o servidor espera JSON, vamos enviar JSON para ele.

$.ajax('SUA URL AQUI',
    { 'data': variavelComSeuJson,
     'type': 'POST',
    'contentType': 'application/json'
    });

Repare que não usei o Stringfy desta vez, pode ser isso que esteja causando seu problema. Tente deste modo e me diga se foi.

Oi Douglas,

Sim já havia enviado com json, porém na própria documentação do JQUERY é falado que quando for usar POST e content type : application/json o header do request muda para OPTIONS, mesmo eu adicionando esse header no response no server, ainda é me apresentado o erro de "Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present"

No server já esta habilitado o CORS, muito bizarro esse erro.

Então o problema está no server, que não está sabendo lidar com essa requisição de preflight.

Existe o site http://enable-cors.org/ que ensina com habilitar o CORS em diferentes webservers, talvez seja de ajuda no seu caso, para que você veja se tudo foi habilitado corretamente.

Essa explicação do StackOverflow também é boa sobre a requisição de preflight com o OPTIONS:

http://stackoverflow.com/a/29954326/2900059

Pelo o que ele diz, até nessa resposta da requisição de preflight tem que conter o header Access-Control-Allow-Origin, que é exatamente o erro que está dando no seu caso.

Acho que a solução seria ver se no servidor o CORS está habilitado da melhor maneira possível.

Por curiosidade, qual webserver você está utilizando ?

Olá Douglas,

O servidor é Tomcat, cara resolvi meu problema fazendo a requisição via servidor, ou seja, fiz a chamada da API por C# e funcionou. Li bastante sobre o assunto, e parece que os browsers tem um bloqueio para POST e content type "application/json" em servidores diferentes (talvez por segurança). Porém fazendo via servidor, isso não ocorre. Foi a unica saída que encontrei..rsrss