ฉันควรเข้ารหัสข้อมูล POST หรือไม่


122

ฉันกำลังโพสต์ข้อมูลไปยัง API ภายนอก (โดยใช้ PHP หากเกี่ยวข้อง)

ฉันควรเข้ารหัส URL ของตัวแปร POST ที่ฉันส่งผ่านหรือไม่

หรือฉันต้องเข้ารหัส URL เท่านั้น GET data?

ขอบคุณ!

UPDATE: นี่คือ PHP ของฉันในกรณีที่เกี่ยวข้อง:

$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
นี่คือ API สำหรับการอ้างอิง: cyclestreets.net/apiดูเหมือนจะไม่ระบุสิ่งที่คาดหวัง
Richard

คำตอบ:


137

คำตอบทั่วไป

คำตอบทั่วไปสำหรับคำถามของคุณคือขึ้นอยู่กับ และคุณสามารถตัดสินใจได้โดยระบุว่า "Content-Type" ของคุณคืออะไรในส่วนหัว HTTP

ค่าของ "application / x-www-form-urlencoded" หมายความว่าเนื้อหา POST ของคุณจะต้องเข้ารหัส URL เหมือนกับสตริงพารามิเตอร์ GET ค่าของ "multipart / form-data" หมายความว่าคุณจะใช้ตัวคั่นเนื้อหาและไม่เข้ารหัส URL ของเนื้อหา

คำตอบนี้มีคำอธิบายอย่างละเอียดมากขึ้นหากคุณต้องการข้อมูลเพิ่มเติม


คำตอบเฉพาะ

สำหรับคำตอบที่เฉพาะเจาะจงไปยังห้องสมุด PHP ที่คุณกำลังใช้ (CURL) คุณควรอ่านเอกสารที่นี่

นี่คือข้อมูลที่เกี่ยวข้อง:

CURLOPT_POST

TRUE เพื่อทำ HTTP POST ปกติ POST นี้เป็นแอปพลิเคชันปกติ / x-www-form-urlencoded ชนิดที่ใช้โดยรูปแบบ HTML มากที่สุด

CURLOPT_POSTFIELDS

ข้อมูลทั้งหมดที่จะโพสต์ในการดำเนินการ HTTP "POST" หากต้องการโพสต์ไฟล์ให้ใส่ชื่อไฟล์ไว้ข้างหน้าด้วย @ และใช้เส้นทางแบบเต็ม ประเภทไฟล์สามารถระบุได้อย่างชัดเจนโดยทำตามชื่อไฟล์ที่มีประเภทในรูปแบบ '; type = mimetype' พารามิเตอร์นี้สามารถส่งผ่านเป็นสตริง urlencoded เช่น 'para1 = val1 & para2 = val2 & ... ' หรือเป็นอาร์เรย์ที่มีชื่อฟิลด์เป็นคีย์และข้อมูลฟิลด์เป็นค่า ถ้า value เป็นอาร์เรย์ส่วนหัว Content-Type จะถูกตั้งค่าเป็น multipart / form-data ใน PHP 5.2.0 ค่าจะต้องเป็นอาร์เรย์หากไฟล์ถูกส่งไปยังตัวเลือกนี้ด้วยคำนำหน้า @


9

@DougW ได้ตอบคำถามนี้อย่างชัดเจน แต่ฉันยังคงต้องการเพิ่มรหัสที่นี่เพื่ออธิบายประเด็นของ Doug (และแก้ไขข้อผิดพลาดในโค้ดด้านบน)

โซลูชันที่ 1: เข้ารหัส URL ข้อมูล POST ด้วยส่วนหัวประเภทเนื้อหา: application / x-www-form-urlencoded

หมายเหตุ: คุณไม่จำเป็นต้อง urlencode $ _POST [] ฟิลด์ทีละรายการฟังก์ชัน http_build_query () สามารถทำงาน 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);

โซลูชันที่ 2: ส่งอาร์เรย์โดยตรงเป็นข้อมูลโพสต์โดยไม่ต้องเข้ารหัส URL ในขณะที่ส่วนหัวประเภทเนื้อหาจะถูกตั้งค่าเป็นหลายส่วน / แบบฟอร์มข้อมูล

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

ข้อมูลโค้ดทั้งสองทำงานได้ แต่ใช้ส่วนหัวและเนื้อหา HTTP ต่างกัน


2

curl จะเข้ารหัสข้อมูลให้คุณเพียงแค่วางข้อมูลฟิลด์ดิบของคุณลงในอาร์เรย์ฟิลด์และบอกให้ "ไป"


1
ฉันใช้เวลาหลายชั่วโมงในการแก้ไขสคริปต์ php curl โดยที่หน้าเว็บ ASP เป้าหมายเปลี่ยนเส้นทางฉันไปยังหน้าแสดงข้อผิดพลาดหลังจากส่งข้อมูล curl post และฉันไม่สามารถหาสาเหตุได้ จากนั้นหลังจากเข้ารหัส url ข้อมูลโพสต์มันใช้งานได้และฉันเริ่มได้รับผลลัพธ์ที่คาดหวัง
Robi

1
ดูว่าเป็นอาร์เรย์หรือไม่จากนั้น curl จะถูกเข้ารหัสโดยอัตโนมัติ หากส่งผ่านเป็นสตริงเราจำเป็นต้อง urlencode ก่อน
Robi

2

โพสต์ด้านบนตอบคำถามเกี่ยวกับการเข้ารหัส URL และวิธีการทำงาน แต่คำถามเดิมคือ "ฉันควรเข้ารหัสข้อมูล POST หรือไม่" ซึ่งไม่ได้รับคำตอบ

จากประสบการณ์ล่าสุดของฉันกับการเข้ารหัส URL ฉันต้องการขยายคำถามเพิ่มเติม "ฉันควรเข้ารหัส URL ข้อมูล POST เหมือนกับเมธอด GET HTTP โดยทั่วไปแล้วฟอร์ม HTML บนเบราว์เซอร์หากมีการกรอกข้อมูลส่งและ / หรือรับข้อมูลบางอย่างเบราว์เซอร์จะเข้ารหัส URL แต่หากแอปพลิเคชันเปิดเผยบริการเว็บและคาดว่า ผู้บริโภคที่จะทำการเข้ารหัส URL กับข้อมูลการเข้ารหัส URL ด้วยวิธี POST HTTP ถูกต้องตามหลักสถาปัตยกรรมหรือไม่ "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.