Отправка файлов как строк в пост-запросе останавливает синтаксический анализ параметров - PullRequest
0 голосов
/ 01 июля 2018

Я создал веб-приложение grails, которое используется для входа в систему, чтобы люди могли отслеживать и изменять свою информацию.

Как часть этого при создании учетной записи, файлы отправляются на контроллер из запроса AJAX. Содержимое строки файла - это то, что отправлено.

Проверка сетевого трафика в Chrome показывает, что данные отправлены правильно.

В запросе отправлено 3 файла, каждый из которых является одним и тем же способом.

Проблема в том, что при отправке третьего файла параметры не анализируются в карте параметров при достижении действия контроллера. Они доступны на request.reader.text. Если отправлено только 2 файла, это работает отлично, и параметры доступны.

Это раньше работало, и я отменил изменения, которые я сделал в UrlMappings, но все еще не повезло.

Я также увеличил maxRequestSize, но я думаю, что размер запроса составляет всего около 18 КБ, так что это не должно быть проблемой.

Другое дело, что у меня есть функция редактирования для пользователя, использующего запрос PUT. Когда делаю то же самое там все отлично работает. Ajax-запросы одинаковы: один использует PUT, а другой POST.

Ниже приведен мой пост-запрос ajax и мой UrlMappings.groovy. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

var request = jQuery.ajax({
        type: 'POST',
        data: {
            firstName: $("input[name='" + _selectors.firstNameSelector + "']").val(),
            lastName: $("input[name='" + _selectors.lastNameSelector + "']").val(),
            dob: $("input[name='" + _selectors.dobSelector + "']").val(),
            email: $("input[name='" + _selectors.emailSelector + "']").val(),
            mobile: $("input[name='" + _selectors.mobileSelector + "']").val(),
            addressLine1: $("input[name='" + _selectors.addressLine1Selector + "']").val(),
            addressLine2: $("input[name='" + _selectors.addressLine2Selector + "']").val(),
            townCity: $("input[name='" + _selectors.townCitySelector + "']").val(),
            postcode: $("input[name='" + _selectors.postcodeSelector + "']").val(),
            emergencyName: $("input[name='" + _selectors.emergencyNameSelector + "']").val(),
            emergencyNumber: $("input[name='" + _selectors.emergencyNumberSelector + "']").val(),
            emergencyEmail: $("input[name='" + _selectors.emergencyEmailSelector + "']").val(),
            emergencyRelationship: $("input[name='" + _selectors.emergencyRelationshipSelector + "']").val(),
            emergencyAddressLine1: $("input[name='" + _selectors.emergencyAddressLine1Selector + "']").val(),
            emergencyAddressLine2: $("input[name='" + _selectors.emergencyAddressLine2Selector + "']").val(),
            emergencyTownCity: $("input[name='" + _selectors.emergencyTownCitySelector + "']").val(),
            emergencyPostcode: $("input[name='" + _selectors.emergencyPostcodeSelector + "']").val(),
            username: $("input[name='" + _selectors.usernameSelector + "']").val(),
            role: $("#role option:selected").val(),
            dateOfJoining: $("input[name='" + _selectors.dateOfJoiningSelector + "']").val(),
            membershipFile: files[_selectors.membershipFileSelector],
            privacyFile: files[_selectors.privacyFileSelector],
            medicalHistories: _self.collectMedicalHistories(),
            classes: _self.collectAttendedClasses(),
            grades: _self.collectGrades(),
            insurances: _self.collectInsurances()
        },
        url: _accountsUrl.addUser,
        success: _self.resolveUserAddSuccessResponse,
        error: _self.showUserAddErrors
 });

UrlMappings.groovy

    "/api/$controller/$action/$id" {
        namespace = "api"
        constraints {}
    }

    "/api/admin/$controller" {
        namespace = "api"
        action = [
                GET   : "get", // show - get one item by id
                POST  : "post", // create - by submitting full content
        ]
    }

    "/api/admin/$controller/$id" {
        namespace = "api"
        action = [
                GET   : "get", // show - get one item by id
                PUT   : "put",  // update - by submitting full content
                DELETE: "delete", // delete - delete one item by id
                POST  : "post", // create - by submitting full content
        ]
    }

1 Ответ

0 голосов
/ 04 июля 2018

Прочитав немного больше, вы не всегда можете рассчитывать на информацию, разбираемую в параметрах. Это действительно должно использоваться только для параметров URL.

Я решил вместо этого попытаться заставить его работать с request.JSON, так как это лучший метод получения информации из тела почтового запроса.

Простое изменение Content-Type на application / json не сработало. Я также должен был сделать

data: JSON.stringify({...})

в запросе ajax. Это наконец получилось!

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