Quando uso curl
via POST
e set CURLOPT_POSTFIELD
, preciso usar urlencode
algum formato especial?
por exemplo: Se eu quiser postar 2 campos, primeiro e último:
first=John&last=Smith
qual é o código / formato exato que deve ser usado com curl?
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);
http_build_query($data)
pois&
é o separador padrão.EDITAR : A partir de php5, o uso de
http_build_query
é recomendado:Exemplo simples do manual:
antes de php5:
Do manual :
Então, algo assim deve funcionar perfeitamente (com parâmetros passados em uma matriz associativa):
fonte
Não passe uma string!
Você pode passar um array e deixar o php / curl fazer o trabalho sujo de codificação, etc.
fonte
http_build_query()
mesmo array)De acordo com o manual do PHP, os dados passados para cURL como uma string devem ser codificados por URL. Veja a página para curl_setopt () e pesquise
CURLOPT_POSTFIELDS
.fonte
Para
CURLOPT_POSTFIELDS
, os parâmetros podem ser passados como uma string codificada por urlpara1=val1¶2=val2&..
ou como uma matriz com o nome do campo como chave e os dados do campo como valorExperimente o seguinte formato:
fonte
json_encode()
vou lhe dar algo realmente diferente de uma string de parâmetro válida comofirst=John&last=Smith
.json_encode()
irá imprimir:{"first":"John","last":"Smith"}
que se tornará o corpo bruto da sua solicitação POST.json_encode(...)
dohttp_build_query(...)
. Isso criará a "string codificada em url" esperada contendo os parâmetros separados por "&".Outra diferença importante que ainda não foi mencionada aqui é que
CURLOPT_POSTFIELDS
não é possível lidar com matrizes aninhadas.Se pegarmos a matriz aninhada,
['a' => 1, 'b' => [2, 3, 4]]
então isso deve ser parametrizado comoa=1&b[]=2&b[]=3&b[]=4
([
e]
será / deve ser codificado por URL). Isso será convertido de volta automaticamente em um array aninhado na outra extremidade (assumindo aqui que a outra extremidade também é PHP).Isso vai funcionar:
Isso não vai funcionar:
Isso lhe dará um aviso. A execução do código continuará e seu endpoint receberá o parâmetro
b
como string"Array"
:fonte
Depende do
content-type
url-codificado ou multipart / form-data
Para enviar dados da maneira padrão, como um navegador faria com um formulário, basta passar um array associativo . Conforme declarado pelo manual do PHP:
Codificação JSON
No entanto, ao se comunicar com APIs JSON, o conteúdo deve ser codificado em JSON para que a API entenda nossos dados POST.
Nesses casos, o conteúdo deve ser explicitamente codificado como JSON:
Ao comunicar no JSON, nós também geralmente definido
accept
econtent-type
cabeçalhos em conformidade:fonte
para matrizes aninhadas, você pode usar:
fonte
Curiosamente, a maneira como o Postman faz o POST é uma operação GET completa com estas 2 opções adicionais:
Apenas outra maneira, e funciona muito bem.
fonte
Essa resposta também me levou uma eternidade para ser encontrada. Descobri que tudo o que você precisa fazer é concatenar a URL ('?' Após o nome e a extensão do arquivo) com a string de consulta codificada por URL. Nem parece que você precisa definir as opções do POST cURL. Veja o exemplo falso abaixo:
Você também pode usar
file_get_contents()
:fonte