¿Debería codificar URL los datos POST?


Estoy publicando datos en una API externa (usando PHP, si es relevante).

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

¿O solo necesito codificar URL para OBTENER datos?

Gracias!

ACTUALIZAR: 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);
Author: Richard, 2011-07-07

3 answers

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 el cuerpo de tu POST tendrá que estar codificado como una cadena de parámetros GET. Un valor de "multipart / form-data" significa que usarás delimitadores de contenido y NO url que codifiquen el contenido.

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


Respuesta específica

Para una respuesta específica a las bibliotecas PHP que estás usando (CURL), deberías leer la documentación aquí.

Aquí está la información relevante:

CURLOPT_POST

TRUE para hacer una publicación HTTP normal. Este POST es el tipo normal application / x-www-form-urlencoded, más utilizado por los formularios HTML.

CURLOPT_POSTFIELDS

Los datos completos a 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 puede ser pasado como una cadena urlencoded como ' para1 = val1&para2=val2&...'o como una matriz con el nombre del campo como clave y los datos del 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@.

 122
Author: DougW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:19

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

Solución 1: URL-codifica los datos POST con un encabezado content-type :application/x-www-form-urlencoded .

Nota: no necesita los campos urlencode fields _POST[] 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 post sin codificación de URL, mientras que el encabezado Content-Type se establecerá 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 usando diferentes encabezados y cuerpos HTTP.

 9
Author: skyfree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-29 20:50:54

Curl codificará los datos por usted, simplemente coloque sus datos de campo sin procesar en la matriz de campos y le dirá que "vaya".

 2
Author: user340140,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-26 23:19:31