Estou tentando postar um objeto JSON usando busca .
Pelo que entendi, preciso anexar um objeto stringificado ao corpo da solicitação, por exemplo:
fetch("/echo/json/",
{
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
method: "POST",
body: JSON.stringify({a: 1, b: 2})
})
.then(function(res){ console.log(res) })
.catch(function(res){ console.log(res) })
Ao usar o json echo do jsfiddle, espero ver o objeto que enviei ( {a: 1, b: 2}
) de volta, mas isso não acontece - o chrome devtools nem mostra o JSON como parte da solicitação, o que significa que ele não está sendo enviado.
javascript
json
fetch-api
Navalha
fonte
fonte
{}
res.json()
deve retornar{a: 1, b: 2}
.json
propriedade que contém os dados que deseja enviar. No entanto, eubody
não estou sendo tratado corretamente de qualquer maneira. Veja este violino para ver que o atraso de 5 segundos é pulado. jsfiddle.net/99arsnkg Além disso, quando você tenta adicionar cabeçalhos adicionais, eles são ignorados. Provavelmente, esse é um problemafetch()
.Respostas:
Com o
async/await
suporte do ES2017 , é assim quePOST
uma carga útil JSON:Não pode usar o ES2017? Veja a resposta de @ vp_art usando promessas
A pergunta, no entanto, está pedindo um problema causado por um bug do Chrome corrigido há muito tempo.
A resposta original segue.
Esse é o problema real aqui , e é um bug com as devtools do chrome , corrigidas no Chrome 46.
Esse código funciona bem - ele está postando o JSON corretamente, simplesmente não pode ser visto.
isso não está funcionando porque esse não é o formato correto para o eco do JSfiddle .
O código correto é:
Para terminais que aceitam cargas JSON, o código original está correto
fonte
x-www-form-urlencoded
) com dados JSON em um campo chamadojson
. Portanto, os dados são duplamente codificados. Para uma postagem JSON limpa, consulte a resposta por @vp_arth abaixo.res.ok
o código de resposta é algum tipo de erro. Também seria bom ter uma.catch()
cláusula no final. Sei que esse é apenas um trecho de amostra, mas lembre-se disso para uso no mundo real.Acho que seu problema
jsfiddle
pode processarform-urlencoded
apenas solicitações.Mas a maneira correta de fazer a solicitação json é passar correta
json
como um corpo:fonte
x-www-form-urlencoded
vsapplication/json
, combinando-os incorretamente ou envolvendo o JSON duas vezes em uma string codificada por URL./echo
rota do jsfiddle ?Nos mecanismos de pesquisa, acabei abordando este tópico para publicar dados não-json com busca, então pensei em adicionar isso.
Para não-json, você não precisa usar dados do formulário. Você pode simplesmente definir o
Content-Type
cabeçalhoapplication/x-www-form-urlencoded
e usar uma string:Uma maneira alternativa de criar essa
body
string, em vez de digitá-la como fiz acima, é usar bibliotecas. Por exemplo, astringify
função dequery-string
ouqs
pacotes. Então, usando isso, ficaria assim:fonte
Depois de passar algum tempo, faça a engenharia reversa do jsFiddle, tentando gerar carga útil - há um efeito.
Por favor, preste atenção na linha
return response.json();
onde a resposta não é uma resposta - é promessa.jsFiddle: http://jsfiddle.net/egxt6cpz/46/ && Firefox> 39 && Chrome> 42
fonte
'x-www-form-urlencoded
vez dissoapplication/json
? Qual é a diferença?application/json
é a forma correta e funciona agora. Obrigado por olho bom:)fetch
( stackoverflow.com/questions/41984893/… ) em vez deapplication/json
. Talvez você sabe por quê ...Content-Type
éapplication/json
, mas seus reaisbody
parece serx-www-form-urlencoded
- eu não acho que isso deve funcionar? Se funcionar, seu servidor deve ser bastante tolerante. A resposta de @vp_arth abaixo parece ser a correta.Eu criei um invólucro fino em torno de fetch () com muitas melhorias se você estiver usando uma API REST puramente json:
Para usá-lo, você tem a variável
api
e 4 métodos:E dentro de uma
async
função:Exemplo com jQuery:
fonte
Object.assign
? deve serObject.assign({}, api.headers, headers)
porque você não deseja continuar adicionando personalizadoheaders
ao hash comumapi.headers
. direita?Isso está relacionado a
Content-Type
. Como você deve ter notado em outras discussões e respostas a essa pergunta, algumas pessoas foram capazes de resolvê-la definindoContent-Type: 'application/json'
. Infelizmente, no meu caso, não funcionou, minha solicitação POST ainda estava vazia no lado do servidor.No entanto, se você tentar com o jQuery
$.post()
e ele estiver funcionando, provavelmente o motivo é o uso do jQuery emContent-Type: 'x-www-form-urlencoded'
vez deapplication/json
.fonte
Teve o mesmo problema - não
body
foi enviado de um cliente para um servidor.Adicionar
Content-Type
cabeçalho resolveu isso para mim:fonte
A resposta principal não funciona no PHP7, porque possui codificação incorreta, mas eu poderia descobrir a codificação correta com as outras respostas. Este código também envia cookies de autenticação, que você provavelmente deseja ao lidar com, por exemplo, fóruns PHP:
fonte
Pode ser útil para alguém:
Eu estava com o problema de que os dados do formulário não estavam sendo enviados para minha solicitação
No meu caso, foi uma combinação dos seguintes cabeçalhos que também estavam causando o problema e o Tipo de Conteúdo errado.
Então, eu estava enviando esses dois cabeçalhos com a solicitação e não estava enviando os dados do formulário quando removi os cabeçalhos que funcionavam.
Além disso, como outras respostas sugerem que o cabeçalho do tipo de conteúdo precisa estar correto.
Para minha solicitação, o cabeçalho correto do tipo de conteúdo era:
Portanto, se os dados do formulário não estiverem sendo anexados à solicitação, podem ser seus cabeçalhos. Tente reduzir os cabeçalhos ao mínimo e, em seguida, adicione-os um por um para ver se o problema está resolvido.
fonte
Eu acho que, não precisamos analisar o objeto JSON em uma string, se o servidor remoto aceitar o json no pedido, basta executar:
Como o pedido de ondulação
Caso o servidor remoto não aceite um arquivo json como corpo, basta enviar um dataForm:
Como o pedido de ondulação
fonte
curl
comando está fazendo implicitamente! Se você não especificar seus objetos antes de passá-los,body
você apenas enviará"[object Object]"
como o corpo da sua solicitação. Um teste simples no Dev Tools mostraria isso. Abra-o e tente isso sem sair desta guia:a = new FormData(); a.append("foo","bar"); fetch("/foo/bar", { method: 'POST', body: {}, headers: { 'Content-type': 'application/json' } })
Se sua carga útil JSON contiver matrizes e objetos aninhados, eu usaria
URLSearchParams
oparam()
método jQuery .Para o seu servidor, isso parecerá um HTML padrão
<form>
sendoPOST
editado.fonte