Cuando utilizo curl
via POST
y configuro, CURLOPT_POSTFIELD
¿tengo que hacerlo urlencode
o algún formato especial?
por ejemplo: si quiero publicar 2 campos, primero y último:
first=John&last=Smith
¿Cuál es el código / formato exacto que debe usarse con 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)
ya que&
es el separador predeterminado.EDITAR : Desde php5 en adelante,
http_build_query
se recomienda el uso de :Ejemplo simple del manual:
antes de php5:
Del manual :
Entonces, algo como esto debería funcionar perfectamente (con parámetros pasados en una matriz asociativa):
fuente
¡No pases una cuerda en absoluto!
Puede pasar una matriz y dejar que php / curl haga el trabajo sucio de la codificación, etc.
fuente
http_build_query()
esa misma matriz)Según el manual de PHP, los datos pasados a cURL como una cadena deben estar codificados en URL. Consulte la página de curl_setopt () y busque
CURLOPT_POSTFIELDS
.fuente
Para
CURLOPT_POSTFIELDS
, los parámetros pueden pasarse como una cadena codificada en URL comopara1=val1¶2=val2&..
o como una matriz con el nombre del campo como clave y los datos del campo como valorPruebe el siguiente formato:
fuente
json_encode()
te dará algo realmente diferente de una cadena de parámetro válida comofirst=John&last=Smith
.json_encode()
saldrá:{"first":"John","last":"Smith"}
que luego se convertirá en el cuerpo sin procesar de su solicitud POST.json_encode(...)
dohttp_build_query(...)
. Esto creará la "cadena codificada en URL" esperada que contiene los parámetros separados por "&".Otra diferencia importante que aún no se menciona aquí es que
CURLOPT_POSTFIELDS
no se pueden manejar matrices anidadas.Si tomamos la matriz anidada
['a' => 1, 'b' => [2, 3, 4]]
, esto debería parametrizarse comoa=1&b[]=2&b[]=3&b[]=4
([
y]
estará / debería estar codificado en URL). Esto se volverá a convertir automáticamente en una matriz anidada en el otro extremo (asumiendo que aquí el otro extremo también es PHP).Esto funcionará:
Esto no funcionará:
Esto le dará un aviso. La ejecución del código continuará y su punto final recibirá el parámetro
b
como una cadena"Array"
:fuente
Depende de
content-type
codificado en URL o multiparte / form-data
Para enviar datos de la forma estándar, como lo haría un navegador con un formulario, simplemente pase una matriz asociativa . Como se indica en el manual de PHP:
Codificación JSON
No obstante, al comunicarse con las API JSON, el contenido debe estar codificado en JSON para que la API comprenda nuestros datos POST.
En tales casos, el contenido debe codificarse explícitamente como JSON:
Cuando nos comunicamos en JSON, también solemos configurar
accept
ycontent-type
encabezados en consecuencia:fuente
para matrices anidadas puede usar:
fuente
Curiosamente, la forma en que Postman hace POST es una operación GET completa con estas 2 opciones adicionales:
Solo de otra forma, y funciona muy bien.
fuente
Esta respuesta también me tomó una eternidad encontrar. Descubrí que todo lo que tienes que hacer es concatenar la URL ('?' Después del nombre y la extensión del archivo) con la cadena de consulta codificada en la URL. Ni siquiera parece que tenga que configurar las opciones POST cURL. Vea el ejemplo falso a continuación:
También puede utilizar
file_get_contents()
:fuente