Я использую jQuery.ajax (), чтобы сделать запрос PUT для веб-службы REST, но вижу очень странное поведение сериализации.
(Прежде чем вы скажете: да, я знаю, что не всебраузеры поддерживают PUT - это всего лишь пример реализации API / Framework, и в конечном итоге он будет вызываться не браузером, а серверной библиотекой, которая поддерживает для поддержки дополнительных глаголов 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 я вижу, что запрос проходит так:
имя = Остин и фамилия = Вебер и адрес = 25463 + Главный + Улица% 2C + Люкс + C & город = Беркли и штат = CA & почтовый индекс = 94707-4513 & email = austin% 40life.com & phone = 555-513-4318 & fax = 510-513-4888 & пароль = nopolyes
Это не ужасно, но в идеале я бы предпочел получить %20
вместо +
для пробелов.Я попытался обернуть каждый поиск значения поля в escape:
firstname: escape($("#update input[name=firstname]").val())
Но это ухудшает ситуацию:
firstname = Austin & фамилия = Weber & address = 25463% 2520Main% 2520Street% 252C% 2520Suite% 2520C & city = Беркли и штат = CA & почтовый индекс = 94707-4513 и электронная почта = austin% 40life.com & phone = 555-513-4318 & fax = 510-513-4888 & thepassword = nopolyes
В этом случае значение уклоняется дважды;поэтому сначала пробел кодируется в %20
, а затем знак% экранируется в %25
, что приводит к %2520
для пробелов и %252C
для запятой в поле адреса.
Чтоя здесь не так делаю?