Tôi có nên mã hóa URL cho dữ liệu POST không?


122

Tôi đang ĐĂNG dữ liệu lên một API bên ngoài (sử dụng PHP, nếu nó có liên quan).

Tôi có nên mã hóa URL cho các biến POST mà tôi chuyển không?

Hay tôi chỉ cần mã hóa URL GET dữ liệu?

Cảm ơn!

CẬP NHẬT: Đây là PHP của tôi, trong trường hợp nó có liên quan:

$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
Đây là API, để tham khảo: cyclestreets.net/api - nó dường như không chỉ định những gì nó mong đợi.
Richard

Câu trả lời:


137

Câu trả lời chung

Câu trả lời chung cho câu hỏi của bạn là nó phụ thuộc. Và bạn có thể quyết định bằng cách chỉ định "Loại-Nội dung" của bạn là gì trong tiêu đề HTTP.

Giá trị "application / x-www-form-urlencoded" có nghĩa là nội dung POST của bạn sẽ cần được mã hóa URL giống như chuỗi tham số GET. Giá trị "nhiều phần / biểu mẫu-dữ liệu" có nghĩa là bạn sẽ sử dụng dấu phân cách nội dung chứ KHÔNG phải url mã hóa nội dung.

Câu trả lời này có một lời giải thích cặn kẽ hơn nhiều nếu bạn muốn biết thêm thông tin.


Câu trả lời cụ thể

Để có câu trả lời cụ thể cho các thư viện PHP bạn đang sử dụng (CURL), bạn nên đọc tài liệu tại đây .

Đây là thông tin liên quan:

CURLOPT_POST

ĐÚNG để thực hiện một ĐĂNG HTTP thông thường. POST này là loại ứng dụng thông thường / x-www-form-urlencoded, được sử dụng phổ biến nhất bởi các biểu mẫu HTML.

CURLOPT_POSTFIELDS

Toàn bộ dữ liệu để đăng trong thao tác "ĐĂNG" HTTP. Để đăng tệp, hãy thêm trước tên tệp bằng @ và sử dụng đường dẫn đầy đủ. Loại tệp có thể được chỉ định rõ ràng bằng cách theo sau tên tệp với kiểu ở định dạng '; type = mimetype'. Tham số này có thể được truyền dưới dạng một chuỗi được mã hóa urê như 'para1 = val1 & para2 = val2 & ...' hoặc dưới dạng một mảng với tên trường là khóa và dữ liệu trường là giá trị. Nếu giá trị là một mảng, tiêu đề Loại-Nội dung sẽ được đặt thành nhiều phần / biểu mẫu-dữ liệu. Kể từ PHP 5.2.0, giá trị phải là một mảng nếu các tệp được chuyển đến tùy chọn này với tiền tố @.


9

@DougW đã trả lời rõ ràng câu hỏi này, nhưng tôi vẫn muốn thêm một số mã vào đây để giải thích các quan điểm của Doug. (Và sửa lỗi trong đoạn mã trên)

Giải pháp 1: Mã hóa URL cho dữ liệu POST với tiêu đề loại nội dung: application / x-www-form-urlencoded.

Lưu ý: bạn không cần phải urlencode $ _POST [] từng trường một, hàm http_build_query () có thể thực hiện tốt công việc 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);

Giải pháp 2: Truyền trực tiếp mảng dưới dạng dữ liệu bài đăng mà không cần mã hóa URL, trong khi tiêu đề Loại-Nội dung sẽ được đặt thành dữ liệu đa phần / biểu mẫu.

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

Cả hai đoạn mã đều hoạt động, nhưng sử dụng các tiêu đề và nội dung HTTP khác nhau.


2

curl sẽ mã hóa dữ liệu cho bạn, chỉ cần thả dữ liệu trường thô của bạn vào mảng trường và yêu cầu nó "đi".


1
Tôi đã dành hàng giờ để sửa một tập lệnh php curl trong đó trang web ASP mục tiêu đang chuyển hướng tôi đến một trang lỗi sau khi gửi dữ liệu bài đăng curl và tôi không thể tìm ra lý do. Sau đó, sau khi mã hóa url dữ liệu bài đăng, nó hoạt động và tôi bắt đầu nhận được kết quả mong đợi của mình.
Robi

1
nó trông nếu nó là mảng, sau đó nó sẽ được tự động mã hóa bằng curl. nếu nó được truyền dưới dạng chuỗi, trước tiên chúng ta cần phải urlencode.
Robi

2

Bài đăng trên trả lời các câu hỏi liên quan đến Mã hóa URL và Cách hoạt động, nhưng câu hỏi ban đầu là "Tôi có nên mã hóa URL cho dữ liệu POST không?" mà không được trả lời.

Từ kinh nghiệm gần đây của tôi với Mã hóa URL, tôi muốn mở rộng câu hỏi thêm. "Tôi có nên mã hóa URL cho dữ liệu POST, giống như phương thức GET HTTP. Nói chung, các Biểu mẫu HTML trên Trình duyệt nếu được điền, gửi và / hoặc NHẬN một số thông tin, thì Trình duyệt sẽ thực hiện Mã hóa URL nhưng nếu ứng dụng hiển thị một dịch vụ web và mong đợi Người tiêu dùng thực hiện Mã hóa URL trên dữ liệu, việc Mã hóa URL bằng phương thức POST HTTP có đúng về mặt kiến ​​trúc và kỹ thuật không? "

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.