¿Debería codificar URL los datos POST?

Estoy PUBLICANDO datos a una API externa (usando PHP, si es relevante).

¿Debería codificar URL las variables POST que paso?

¿O solo necesito codificar URL los datos GET?

¡Gracias!

ACTUALIZACIÓN: Este es mi PHP, en caso de que sea relevante:

$fields = array( 'mediaupload'=>$file_field, 'username'=>urlencode($_POST["username"]), 'password'=>urlencode($_POST["password"]), 'latitude'=>urlencode($_POST["latitude"]), 'longitude'=>urlencode($_POST["longitude"]), 'datetime'=>urlencode($_POST["datetime"]), 'category'=>urlencode($_POST["category"]), 'metacategory'=>urlencode($_POST["metacategory"]), 'caption'=>($_POST["description"]) ); $fields_string = http_build_query($fields); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST,count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS,$fields); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); 

Respuesta general

La respuesta general a tu pregunta es que depende. Y puede decidir especificando cuál es su “Tipo de contenido” en los encabezados HTTP.

Un valor de “application / x-www-form-urlencoded” significa que su cuerpo POST necesitará ser URL codificada igual que una cadena de parámetros GET. Un valor de “multipart / form-data” significa que usará delimitadores de contenido y NO URL que codifiquen el contenido.

Esta respuesta tiene una explicación mucho más completa si desea obtener más información.


Respuesta específica

Para obtener una respuesta específica a las bibliotecas PHP que está utilizando (CURL), debe leer la documentación aquí .

Aquí está la información relevante:

CURLOPT_POST

CIERTO hacer un POST HTTP regular. Este POST es el tipo de aplicación normal / x-www-form-urlencoded, más comúnmente utilizado por los formularios HTML.

CURLOPT_POSTFIELDS

La información completa para publicar en una operación HTTP “POST”. Para publicar un archivo, anteponga un nombre de archivo con @ y use la ruta completa. El tipo de archivo se puede especificar explícitamente siguiendo el nombre del archivo con el tipo en el formato ‘; type = mimetype’. Este parámetro se puede pasar como una cadena urlencoded como ‘para1 = val1 & para2 = val2 & …’ o como una matriz con el nombre del campo como clave y datos de campo como valor. Si value es una matriz, el encabezado Content-Type se establecerá en multipart / form-data. A partir de PHP 5.2.0, el valor debe ser una matriz si los archivos se pasan a esta opción con el prefijo @.

@DougW ha respondido claramente esta pregunta, pero todavía me gustaría agregar algunos códigos aquí para explicar los puntos de Doug. (Y corregir errores en el código anterior)

Solución 1: encoding URL de los datos POST con un encabezado de tipo de contenido: application / x-www-form-urlencoded.

Nota: no necesita urlencode $ _POST [] campos uno por uno, la función http_build_query () puede hacer el trabajo de urlencoding muy bien.

 $fields = array( 'mediaupload'=>$file_field, 'username'=>$_POST["username"], 'password'=>$_POST["password"], 'latitude'=>$_POST["latitude"], 'longitude'=>$_POST["longitude"], 'datetime'=>$_POST["datetime"], 'category'=>$_POST["category"], 'metacategory'=>$_POST["metacategory"], 'caption'=>$_POST["description"] ); $fields_string = http_build_query($fields); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); 

Solución 2: Pase la matriz directamente como los datos de la publicación sin encoding URL, mientras que la cabecera Content-Type se configurará en multipart / form-data.

 $fields = array( 'mediaupload'=>$file_field, 'username'=>$_POST["username"], 'password'=>$_POST["password"], 'latitude'=>$_POST["latitude"], 'longitude'=>$_POST["longitude"], 'datetime'=>$_POST["datetime"], 'category'=>$_POST["category"], 'metacategory'=>$_POST["metacategory"], 'caption'=>$_POST["description"] ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS,$fields); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); 

Ambos fragmentos de código funcionan, pero usan diferentes encabezados y cuerpos HTTP.

curl codificará los datos por usted, solo deje caer sus datos de campo sin procesar en la matriz de campos y dígale que “vaya”.