Observei que, ao usar $ .post () no jquery, o contentType padrão é application / x-www-form-urlencoded - quando meu código asp.net mvc precisa ter contentType = application / json
(Consulte esta pergunta para saber por que devo usar application / json: ASPNET MVC - Por que ModelState.IsValid é falso "O campo x é obrigatório" quando esse campo tem um valor? )
Como posso fazer com que $ .post () envie contentType = application / json? Eu já tenho um grande número de funções $ .post (), então não quero mudar para $ .ajax () porque levaria muito tempo
Se eu tentar
$.post(url, data, function(), "json")
Ele ainda possui contentType = application / x-www-form-urlencoded. Então, o que exatamente o parâmetro "json" faz se não altera o tipo de conteúdo para json?
Se eu tentar
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
Isso funciona, mas afeta todos os $ .get e $ .post que eu tenho e faz com que alguns sejam quebrados.
Então, existe alguma maneira de alterar o comportamento de $ .post () para enviar contentType = application / json?
fonte
jQuery.post
método, é uma função muito simples ..."mystring data"
estaráapplication/x-www-form-urlencoded;
onde um objeto{ anyKey: "anyvalue and type" }
estaráapplication/json
. Muitos servidores que lêem json permitem apenas um objeto ou matriz, não uma string - por isso, o jquery prevê as coisas dessa maneira. Se você possui um servidor que lê seqüências de caracteres, números, etc, sem ser envolvido em um objeto, deve especificar o tipo de conteúdo como nesta resposta.Consulte: jQuery.ajax ()
fonte
JSON.stringify(data)
, pois o servidor espera uma string JSON e o jQuery simplesmente concatenaria os pares de valores-chave usando e comercial, codificado em forma de URL.Finalmente encontrei a solução, que funciona para mim:
fonte
data
argumentox-www-form-urlencoded
, mas se você indicar que o tipo de conteúdo da solicitação é JSON, ele ainda insistirá em enviardata
em um formato incompatível.Acabei adicionando o seguinte método ao jQuery no meu script:
E para usá-lo
Isso foi feito simplesmente copiando o código de "get" e "post" das fontes originais do JQuery e codificando alguns parâmetros para forçar um JSON POST.
Obrigado!
fonte
use apenas
ATUALIZADO @JK: Se você escrever em sua pergunta apenas um exemplo de código com $ .post, encontrará um exemplo correspondente na resposta. Não quero repetir as mesmas informações que você já estudou até saber: $ .post e $ .get são formas curtas de $ .ajax. Portanto, basta usar $ .ajax e você pode usar todo o conjunto de parâmetros sem precisar alterar nenhuma configuração global.
A propósito, eu não recomendaria substituir o $ .post padrão. É minha opinião pessoal , mas para mim é importante, não apenas que o programa funcione, mas também que todos que leem o seu programa o entendam da mesma maneira. A substituição de métodos padrão sem ter um motivo muito importante pode resultar em mal - entendidos na leitura do código do programa. Então, repito minha recomendação mais uma vez: basta usar o formulário $ .ajax original jQuery em vez de
jQuery.get
ejQuery.post
e você recebe programas que não apenas funcionam perfeitamente, mas podem ser lidos por pessoas sem nenhum mal-entendido.fonte
O tipo de dados "json" que você pode passar como o último parâmetro para postar () indica que tipo de dados a função espera na resposta do servidor, não o tipo que está enviando na solicitação. Especificamente, ele define o cabeçalho "Accept".
Honestamente, sua melhor aposta é mudar para uma chamada ajax (). A função post () é uma conveniência; uma versão simplificada do ajax () solicita quando você está apenas enviando um simples formulário. Você não é.
Se você realmente não deseja alternar, pode criar sua própria função chamada, digamos, xpost (), e simplesmente transformá-los em parâmetros para uma chamada jQuery ajax (), com o tipo de conteúdo definido. Dessa forma, em vez de reescrever todas essas funções post () em funções ajax (), você só precisa alterá-las de post para xpost (ou o que for).
fonte
Esta extensão simples da API jquery (de: https://benjamin-schweizer.de/jquerypostjson.html ) para $ .postJSON () faz o truque. Você pode usar o postJSON () como qualquer outra chamada nativa do jquery Ajax. Você pode anexar manipuladores de eventos e assim por diante.
Como outras APIs do Ajax (como $ http do AngularJS), ele define o contentType correto como application / json. Você pode passar seus dados json (objetos javascript) diretamente, uma vez que são estritamente aqui. O dataType retornado esperado é definido como JSON. Você pode anexar manipuladores de eventos padrão do jquery para promessas, por exemplo:
fonte
Eu sei que esta é uma resposta tardia, na verdade, tenho um método de atalho que eu uso para postar / ler para / de serviços baseados em MS .. ele funciona tanto com MVC quanto com ASMX, etc.
Usar:
NOTA: Também tenho um método JSON.parseAjax modificado do arquivo JS do json.org, que adiciona manipulação para as datas "/Date(...)/" do MS ...
O arquivo json2.js modificado não está incluído, ele usa o analisador baseado em script no caso do IE8, pois há casos em que o analisador nativo é interrompido quando você estende o protótipo de matriz e / ou objeto, etc.
Estou pensando em renovar esse código para implementar as interfaces promissoras, mas funcionou muito bem para mim.
fonte
No cerne da questão está o fato de o JQuery no momento da redação não ter um método postJSON enquanto o getJSON existe e faz a coisa certa.
um método postJSON faria o seguinte:
e pode ser usado assim:
fonte
A documentação mostra atualmente que a partir de 3.0, $ .post aceitará as configurações do objeto, o que significa que você pode usar as opções $ .ajax. O 3.0 ainda não foi lançado e, no commit, eles estão falando sobre ocultar a referência a ele nos documentos, mas procure-a no futuro!
fonte
Eu tive um problema semelhante com o seguinte código JavaScript:
Onde no Violinista eu pude ver a solicitação com:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"value":"5","maxValue":"5"}
Como resultado, meu servidor não pôde mapear um objeto para um tipo de servidor.
Depois de alterar a última linha para esta:
No Violinista eu ainda podia ver:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
value=5&maxValue=10
No entanto, o servidor começou a retornar o que eu esperava.
fonte
E o seu próprio adaptador / invólucro?
E uso extremamente simples:
fonte
Por alguma razão, definir o tipo de conteúdo na solicitação ajax como sugerido por @Adrien não funcionou no meu caso. No entanto, você pode alterar o tipo de conteúdo usando $ .post fazendo isso antes:
Então faça sua
$.post
ligação:Eu tive problemas com o jQuery + IIS, e essa foi a única solução que ajudou o jQuery a entender o uso da codificação windows-1252 para solicitações de ajax.
fonte
podemos mudar o tipo de conteúdo assim em $ .post
$ .post (url, dados, função (dados, status, xhr) {xhr.setRequestHeader ("Tipo de conteúdo", "aplicativo / x-www-form-urlencoded; charset = utf-8");});
fonte
$ .post não funciona se você tiver um problema de CORS (compartilhamento de recursos de origem cruzada). Tente usar $ .Ajax no seguinte formato: "$ .ajax ({url: someurl, contentType: 'application / json', dados: requestInJSONFormat, headers: {'Access-Control-Allow-Origin': '*'}, dataType: 'json', tipo: 'POST', assíncrono: falso, sucesso: função (Dados) {...}}); "
fonte
Você não pode enviar
application/json
diretamente - ele deve ser um parâmetro de uma solicitação GET / POST.Então, algo como
fonte