2013-08-22 33 views
11

Về dòng này:Dữ liệu bài đăng ajax có cần phải được mã hóa URI không?

var data = encodeURIComponent(JSON.stringify(object_literal)); 

Tôi không hiểu tại sao điều này đang được URI được mã hóa.

Dữ liệu sau sẽ được gửi qua ajax POST.

Tôi hiểu rằng URL, đặc biệt là một trong những bạn có thể thấy trong thanh địa chỉ trình duyệt yêu cầu ký tự đặc biệt như đã mô tả ở đây:

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

Nhưng những gì chính xác này có liên quan gì với Ajax gửi bài?

Làm cả thanh địa chỉ url và bài đăng ajax nội bộ đều sử dụng cùng một cơ chế?

+0

Dữ liệu bài đăng được gửi trong phần nội dung của yêu cầu http và nhận dữ liệu được nối vào URL, do đó cơ chế khác nhau. Tại sao bạn cho rằng dữ liệu bài đăng cần phải được mã hóa uri? Dường như nó không phải là ... http://jsfiddle.net/DXWqX/ – nbrooks

+0

Điều đó đúng cho các yêu cầu nhận được, phải được mã hóa URI. Yêu cầu nhận được là những gì trình duyệt của bạn thực hiện khi bạn nhập URL. Tất cả những gì nó làm là nối thêm dữ liệu vào url dưới dạng tham số truy vấn 'url? Param1 = value1 & param2 = value2'. Yêu cầu đăng không làm điều đó. – nbrooks

Trả lời

18

Tất cả đều phụ thuộc vào content type.

Thông thường khi một <form> sử dụng phương thức HTTP POST thì giá trị biểu mẫu là URL Encoded và được đặt trong phần thân của reqeust. Các tiêu đề kiểu nội dung như sau:

content-type: application/x-www-form-urlencoded 

Hầu hết các thư viện AJAX sẽ làm điều này theo mặc định vì nó phổ biến được chấp nhận giữa các máy chủ web. Tuy nhiên, không có gì ngăn cản bạn chỉ đơn giản là seralizing dữ liệu như JSON hoặc XML và sau đó gửi nó với một kiểu nội dung khác.

content-type: application/json 

hoặc

content-type: text/xml 

Nó đáng chú ý là các tải trọng không có gì để làm với AJAX! Dưới mui xe, tất cả chúng đều sử dụng đối tượng XmlHttpRequest để gửi yêu cầu HTTP không đồng bộ đến máy chủ. Nó không quan trọng nếu bạn gửi văn bản thuần, JSON, XML, hoặc thậm chí dữ liệu nhị phân thô miễn là bạn nói với máy chủ cách giải thích các bit đó.

Mã hóa url hoàn toàn là một tạo tác lịch sử về cách <form> phần tử đã đăng dữ liệu của họ lên máy chủ trước khi AJAX ở gần.

+0

Như @Josh đã đề cập $ .ajax làm mã hóa này theo mặc định. –

+0

O.K. theo cả hai câu trả lời, tôi không cần phải URI mã hóa bài viết ajax của tôi. Tôi đang xóa nó. –

+0

@mark_huffington - Hy vọng rằng bản cập nhật của tôi bổ sung thêm một số sự rõ ràng. Nó chỉ đơn giản là một tạo tác lịch sử về cách web hoạt động trước ajax. Thư viện AJAX đã làm điều này theo mặc định chỉ đơn giản là để cung cấp khả năng tương thích ngược với phần lớn các trang web ra khỏi đó bởi vì họ ** dự kiến ​​** dữ liệu được đăng trong thời trang này. Bây giờ nó không thực sự quan trọng như nhiều. XHR chỉ là một cơ chế vận chuyển. Nó không nói gì về nội dung của yêu cầu. – Josh

0

Không, họ không làm như vậy. Không cần thiết khi nó được gửi dưới dạng dữ liệu qua Ajax BÀI ĐĂNG.

Bạn có thể gửi tinh khiết JSON unencoded sử dụng AJAX

var ajaxObject = $.ajax({ 
    url: 'url', 
    type: 'POST', 
    data: JSON.stringify(object_literal); 
}); 
+0

Thuộc tính 'dataType' chỉ được sử dụng để cho biết loại dữ liệu bạn mong đợi phản hồi từ máy chủ. Nó không liên quan gì đến việc chỉ ra nội dung của bài đăng. Bạn nên đặt thuộc tính 'contentType' thành' 'application/json''. – Brett

+0

vâng, tôi có lẽ không nên bao gồm phần đó, nhưng nó là một phần của mã của tôi tôi sử dụng;) –

2

encodeURIComponent là phải vượt qua các biến trên các liên kết sử dụng GET

JSON.stringify() mã hóa tự động vào utf8

chỉ trong một số trường hợp hiếm hoi ví dụ như khi bạn muốn chuyển đổi charachters lạ để Base64 các encodeURIComponent được sử dụng bên ngoài từ GET .

đây là một ví dụ

base64_encode=function(a){ 
return window.btoa(unescape(encodeURIComponent(a))); 
}; 

https://developer.mozilla.org/en-US/docs/Web/API/window.btoa

nói rằng ..

nếu bạn sử dụng một dịch vụ REST APImỗiajax GET request mà là một tham số chuỗi cần được mã hóa với encodeURIComponent.

đây là một ví dụ sử dụng YQL

https://stackoverflow.com/a/18302867/2450730

4

câu trả lời của Josh là tốt, nhưng tôi nghĩ rằng nó thiếu một cái gì đó. Theo truyền thống, dữ liệu biểu mẫu được đăng bằng cách sử dụng cùng một định dạng như truy vấn. ví dụ: param1=value1&param2=value2 và sự khác biệt duy nhất giữa GET và POST là POST đặt các tham số này vào nội dung thư trong khi GET đưa chúng vào URL. Tuy nhiên, vấn đề hiển nhiên là nếu tên hoặc giá trị tham số của bạn bao gồm các ký tự không thoát như &=, thì bạn sẽ tăng khả năng tự động phân tích cú pháp bộ sưu tập thông số của máy chủ, dẫn đến hỏng dữ liệu. Sử dụng chức năng encodeURIComponent() của Javascript trên mỗi giá trị tham số sẽ thoát khỏi tất cả các ký tự này cho bạn. Vì vậy, nếu bạn không sử dụng bộ sưu tập thông số chuẩn cũ ở phía máy chủ - ví dụ, nếu bạn đang phân tích cú pháp JSON - thì không cần phải mã hóa URL văn bản. Ngoài ra, không có lý do gì để mã hóa URL nếu bạn không phân tích cú pháp nhiều tham số ở phía máy chủ để chạy encodeURIComponent một lần trên toàn bộ nội dung thư không có ý nghĩa gì.

Lưu ý phụ: nếu bạn đang sử dụng asp.net và cố gắng cho phép người dùng chuyển html sang máy chủ, encodeURIComponent sẽ cho phép bạn thực hiện việc này mà không tắt xác thực yêu cầu thường cấm điều này. Tôi không nghĩ rằng gửi nó như JSON, một mình, sẽ thực hiện điều này.

Các vấn đề liên quan