Devo codificare in URL i dati POST?


122

Sto POSTANDO i dati su un'API esterna (utilizzando PHP, se pertinente).

Devo codificare in URL le variabili POST che passo?

O devo solo codificare in URL i dati GET?

Grazie!

AGGIORNAMENTO: Questo è il mio PHP, nel caso sia rilevante:

$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);

1
Questa è l'API, per riferimento: cyclestreets.net/api - non sembra specificare cosa si aspetta.
Richard

Risposte:


137

Risposta generale

La risposta generale alla tua domanda è che dipende. E puoi decidere specificando quale sia il tuo "Content-Type" nelle intestazioni HTTP.

Un valore di "application / x-www-form-urlencoded" significa che il corpo del POST dovrà essere codificato in URL proprio come una stringa di parametri GET. Un valore di "multipart / form-data" significa che utilizzerai i delimitatori di contenuto e NON la codifica URL del contenuto.

Questa risposta ha una spiegazione molto più approfondita se desideri maggiori informazioni.


Risposta specifica

Per una risposta specifica alle librerie PHP che stai utilizzando (CURL), dovresti leggere la documentazione qui .

Ecco le informazioni rilevanti:

CURLOPT_POST

TRUE per eseguire un normale HTTP POST. Questo POST è il tipo normale application / x-www-form-urlencoded, più comunemente usato dai form HTML.

CURLOPT_POSTFIELDS

I dati completi da pubblicare in un'operazione "POST" HTTP. Per pubblicare un file, anteponi @ al nome di un file e utilizza il percorso completo. Il tipo di file può essere specificato esplicitamente seguendo il nome del file con il tipo nel formato '; type = mimetype'. Questo parametro può essere passato come una stringa con codifica url come "para1 = val1 & para2 = val2 & ..." o come array con il nome del campo come chiave e i dati del campo come valore. Se il valore è un array, l'intestazione Content-Type verrà impostata su multipart / form-data. A partire da PHP 5.2.0, il valore deve essere un array se i file vengono passati a questa opzione con il prefisso @.


9

@DougW ha risposto chiaramente a questa domanda, ma mi piace ancora aggiungere alcuni codici qui per spiegare i punti di Doug. (E correggi gli errori nel codice sopra)

Soluzione 1: codifica in URL i dati POST con un'intestazione del tipo di contenuto: application / x-www-form-urlencoded.

Nota: non è necessario utilizzare urlencode $ _POST [] i campi uno per uno, la funzione http_build_query () può svolgere bene il lavoro di urlencoding.

$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);

Soluzione 2: passa l'array direttamente come dati del post senza codifica URL, mentre l'intestazione Content-Type verrà impostata su 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);

Entrambi gli snippet di codice funzionano, ma utilizzano intestazioni e corpi HTTP diversi.


2

curl codificherà i dati per te, trascina semplicemente i tuoi dati grezzi di campo nell'array dei campi e digli di "andare".


1
Ho passato ore a correggere uno script php curl in cui la pagina Web ASP di destinazione mi reindirizza a una pagina di errore dopo aver inviato i dati del post curl e non sono riuscito a capire perché. Quindi, dopo aver codificato l'URL dei dati del post, ha funzionato e ho iniziato a ottenere il risultato previsto.
Robi

1
sembra che sia un array, quindi verrà codificato automaticamente da curl. se viene passato come stringa, dobbiamo prima urlencode.
Robi

2

I post precedenti rispondono a domande relative alla codifica URL e al suo funzionamento, ma la domanda originale era "Devo codificare in URL i dati POST?" che non ha risposta.

Dalla mia recente esperienza con la codifica URL, vorrei estendere ulteriormente la domanda. "Devo codificare in URL i dati POST, come per il metodo GET HTTP. In genere, i moduli HTML sul browser se vengono compilati, inviati e / o OTTENGONO alcune informazioni, i browser eseguiranno la codifica URL ma se un'applicazione espone un servizio web e si aspetta I consumatori devono eseguire la codifica URL sui dati, è corretto dal punto di vista architettonico e tecnico eseguire la codifica URL con il metodo POST HTTP? "

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.