http - example - url encode php
¿Debería codificar URL los datos POST? (3)
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: codificación 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 codificación 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".