我正在使用jQuery.ajax()向REST Web服务发出PUT请求,但看到了一些非常奇怪的序列化行为。
(在您说出来之前:是的,我知道并非所有浏览器都支持PUT-这只是api /框架的示例实现,最终不会被浏览器调用,而是由服务器端库调用支持多余的http动词。)
形式如下:
<form action="/example/api/artist" method="put" id="update">
First Name: <input type="text" name="firstname" /><br/>
Last Name: <input type="text" name="lastname" /><br/>
Address: <input type="text" name="address" /><br/>
City: <input type="text" name="city" /><br/>
State: <input type="text" name="state" /><br/>
Postal Code: <input type="text" name="postalcode" /><br/>
Email: <input type="text" name="email" /><br/>
Phone: <input type="text" name="phone" /><br/>
Fax: <input type="text" name="fax" /><br/>
Password: <input type="text" name="thepassword" /><br/>
<input type="hidden" name="debug" value="true" />
<input type="submit" value="Update Artist" />
<input type="reset" value="Cancel" id="updateCancel" />
</form>
和JS:
$("#update").submit(function(e){
e.preventDefault();
var frm = $(this);
$.ajax({
url: frm.attr('action'),
data:{
firstname: $("#update input[name=firstname]").val(),
lastname: $("#update input[name=lastname]").val(),
address: $("#update input[name=address]").val(),
city: $("#update input[name=city]").val(),
state: $("#update input[name=state]").val(),
postalcode: $("#update input[name=postalcode]").val(),
email: $("#update input[name=email]").val(),
phone: $("#update input[name=phone]").val(),
fax: $("#update input[name=fax]").val(),
thepassword: $("#update input[name=thepassword]").val()
},
type: frm.attr('method'),
dataType: "json",
contentType: "application/json",
success: function (data, textStatus, xhr){
console.log(data);
reloadData();
},
error: function (xhr, textStatus, err){
console.log(textStatus);
console.log(err);
}
});
});
使用FireBug时,我看到请求是这样进行的:
firstname = Austin&lastname = Weber&address = 25463 + Main + Street%2C + Suite + C&city = Berkeley&state = CA&postalcode = 94707-4513&email = austin%40life.com&phone = 555-513-4318&fax = 510-513-4888&thepassword = nopolyes
这并不可怕,但是理想情况下,我宁愿使用
%20
而不是+
作为空格。我尝试将每个字段值查找包装在转义符中:firstname: escape($("#update input[name=firstname]").val())
但这使情况更糟:
firstname = Austin&lastname = Weber&address = 25463%2520Main%2520Street%252C%2520Suite%2520C&city = Berkeley&state = CA&postalcode = 94707-4513&email = austin%40life.com&phone = 555-513-4318&fax = 510-513-4888&thepassword = nopolyes
在这种情况下,该值将被转义两次。因此,首先将空格编码为
%20
,然后将%符号转义为%25
,从而在地址字段中产生%2520
空格和%252C
逗号。我在这里做错了什么?
最佳答案
+
是空格的常规转义符,即使未在RFC1738中定义。一直以来,出于历史原因一直使用它。这是个大问题吗?我认为您的许多客户实现可能期望+
也能正常工作。