¿Debo codificar en URL los datos POST?

122

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

¿Debo codificar en URL las variables POST que paso?

¿O solo necesito codificar URL para obtener 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);
Ricardo
fuente
1
Esta es la API, para referencia: cyclestreets.net/api : no parece especificar lo que espera.
Richard

Respuestas:

136

Respuesta general

La respuesta general a su 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 deberá estar codificado en URL como una cadena de parámetro GET. Un valor de "multipart / form-data" significa que usará delimitadores de contenido y NO codificará el contenido.

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


Respuesta especifica

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

VERDADERO para hacer una 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

Los datos completos 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 codificada como 'para1 = val1 & para2 = val2 & ...' o como una matriz con el nombre del campo como clave y los datos del campo como valor. Si el valor 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
fuente
9

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

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

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

$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 datos de publicación 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 con diferentes encabezados y cuerpos HTTP.

sin cielo
fuente
2

curl codificará los datos por usted, simplemente suelte los datos de campo sin procesar en la matriz de campos y dígale que "vaya".

usuario340140
fuente
1
Pasé horas arreglando un script php curl donde la página web ASP de destino me redirige a una página de error después de enviar datos curl post y no pude entender por qué. Luego, después de codificar los datos de la URL, funcionó y comencé a obtener el resultado esperado.
Robi
1
se ve si es una matriz, luego se codificará automáticamente por curl. Si se pasa como una cadena, primero debemos urlencode.
Robi
2

Las publicaciones anteriores responden preguntas relacionadas con la codificación de URL y cómo funciona, pero las preguntas originales eran "¿Debo codificar los datos POST de la URL?" que no se responde

Desde mi experiencia reciente con la codificación de URL, me gustaría ampliar aún más la pregunta. "Debo codificar los datos POST de la URL, igual que el método GET HTTP. En general, los formularios HTML sobre el navegador si se rellenan, envían y / o OBTENEN alguna información, los navegadores harán la codificación de URL pero si una aplicación expone un servicio web y espera Los consumidores deben realizar la codificación de URL en los datos, ¿es correcto arquitectónicamente y técnicamente hacer la codificación de URL con el método POST HTTP? "

Varun
fuente