Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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