Haruskah saya menyandikan URL data POST?

122

Saya melakukan POST data ke API eksternal (menggunakan PHP, jika relevan).

Haruskah saya menyandikan URL variabel POST yang saya teruskan?

Atau apakah saya hanya perlu menyandikan URL data GET?

Terima kasih!

UPDATE: Ini adalah PHP saya, jika relevan:

$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);
Richard
sumber
1
Ini adalah API, untuk referensi: cyclestreets.net/api - tampaknya tidak menentukan apa yang diharapkan.
Richard

Jawaban:

137

Jawaban Umum

Jawaban umum atas pertanyaan Anda adalah tergantung. Dan Anda dapat memutuskan dengan menentukan apa "Jenis Konten" Anda di header HTTP.

Nilai "application / x-www-form-urlencoded" berarti bahwa badan POST Anda harus dienkode URL seperti string parameter GET. Nilai "multipart / form-data" berarti bahwa Anda akan menggunakan pemisah konten dan BUKAN pengodean url konten.

Jawaban ini memiliki penjelasan yang jauh lebih lengkap jika Anda menginginkan informasi lebih lanjut.


Jawaban Khusus

Untuk jawaban khusus untuk pustaka PHP yang Anda gunakan (CURL), Anda harus membaca dokumentasinya di sini .

Berikut informasi yang relevan:

CURLOPT_POST

BENAR untuk melakukan HTTP POST biasa. POST ini adalah jenis application / x-www-form-urlencoded normal, paling umum digunakan oleh formulir HTML.

CURLOPT_POSTFIELDS

Data lengkap yang akan diposting dalam operasi HTTP "POST". Untuk memposting file, tambahkan nama file dengan @ dan gunakan jalur lengkap. Jenis file dapat ditentukan secara eksplisit dengan mengikuti nama file dengan tipe dalam format '; type = mimetype'. Parameter ini dapat dikirimkan sebagai string yang dikodekan url seperti 'para1 = val1 & para2 = val2 & ...' atau sebagai larik dengan nama bidang sebagai kunci dan data bidang sebagai nilai. Jika nilainya adalah sebuah larik, header Tipe Konten akan disetel ke multipart / form-data. Mulai dari PHP 5.2.0, nilai harus berupa array jika file diteruskan ke opsi ini dengan awalan @.

DougW
sumber
9

@DougW telah menjawab pertanyaan ini dengan jelas, tetapi saya masih ingin menambahkan beberapa kode di sini untuk menjelaskan poin Doug. (Dan perbaiki kesalahan pada kode di atas)

Solusi 1: Menyandikan URL data POST dengan header tipe konten: application / x-www-form-urlencoded.

Catatan: Anda tidak perlu meng-urlencode $ _POST [] satu per satu, fungsi http_build_query () dapat melakukan pekerjaan urlencoding dengan baik.

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

Solusi 2: Teruskan array secara langsung sebagai data posting tanpa pengkodean URL, sedangkan header Content-Type akan disetel ke 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);

Kedua cuplikan kode berfungsi, tetapi menggunakan header dan badan HTTP yang berbeda.

skyfree
sumber
2

curl akan menyandikan data untuk Anda, cukup letakkan data bidang mentah Anda ke dalam larik bidang dan beri tahu untuk "pergi".

pengguna340140
sumber
1
Saya menghabiskan berjam-jam untuk memperbaiki skrip php curl di mana halaman web ASP target mengarahkan saya ke halaman kesalahan setelah mengirim data posting curl dan saya tidak dapat mencari tahu mengapa. Kemudian setelah url mengkodekan data posting, itu berfungsi dan saya mulai mendapatkan hasil yang saya harapkan.
Robi
1
Ini terlihat jika itu adalah array, maka itu akan di-urlencoded secara otomatis oleh curl. jika dilewatkan sebagai string, kita perlu urlencode terlebih dahulu.
Robi
2

Posting di atas menjawab pertanyaan yang terkait dengan Encoding URL dan Bagaimana cara kerjanya, tetapi pertanyaan asli adalah "Haruskah saya menyandikan URL data POST?" yang tidak terjawab.

Dari pengalaman saya baru-baru ini dengan Pengkodean URL, saya ingin memperluas pertanyaan lebih jauh. "Haruskah saya menyandikan URL data POST, sama seperti metode GET HTTP. Umumnya, Formulir HTML melalui Browser jika diisi, dikirim dan / atau DAPATKAN beberapa informasi, Browser akan melakukan Pengkodean URL tetapi Jika aplikasi menampilkan layanan web dan mengharapkan Konsumen harus melakukan URL-Encoding pada data, apakah secara Arsitektur dan Teknis benar untuk melakukan Encode URL dengan metode HTTP POST? "

Varun
sumber