Значения кодирования jQuery отличаются от ожидаемых для элементов данных jQuery.ajax - PullRequest
2 голосов
/ 09 июня 2010

Я использую 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 для запятой в поле адреса.

Чтоя здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

+ - это обычный escape-символ для пробелов, хотя он не определен в RFC1738.Он использовался так по историческим причинам с незапамятных времен.Это большая проблема?Я думаю, что многие реализации ваших клиентов могут ожидать, что + также работает.

1 голос
/ 09 июня 2010

Вы используете встроенную сериализацию объектов.Сделайте это сами в этом случае:

data: "firstname=" + $("#update input[name=firstname]").val() + "&lastname=" // so on and so on

или, что еще лучше, сделайте функцию сделать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...