在 post 请求中以字符串形式发送文件会停止解析参数
Sending files as strings in post request stops params being parsed
我创建了一个用作会员登录的 grails 网络应用程序,以便人们可以跟踪和更改他们的信息。
作为创建帐户时的一部分,文件从 ajax 请求发送到控制器。文件的字符串内容就是发送的内容
检查chrome中的网络流量显示数据发送正确。
请求中发送了3个文件,每个都是同一个文件,发送方式相同。
问题是当发送第三个文件时,参数到达controller action时没有解析到parameter map。它们可在 request.reader.text 获得。如果只发送了 2 个文件,那么它可以完美运行并且参数可用。
这曾经有效,我已经恢复了我在 UrlMappings 中所做的更改,但仍然没有成功。
我也增加了 maxRequestSize,但我认为请求大小只有大约 18Kb,所以这应该不是问题。
另一件事是我为使用 PUT 请求的用户提供了编辑功能。在那里做同样的事情时一切正常。 ajax 个请求是相同的,一个只使用 PUT,另一个 POST.
下面是我的 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
]
}
阅读更多内容后,您不能总是依赖被解析为参数的信息。它应该只真正用于 url 参数。
我决定改为尝试让它与 request.JSON 一起使用,因为这是从 post 请求正文中检索信息的更好方法。
只是将 Content-Type 更改为 application/json 是行不通的。我也必须做
data: JSON.stringify({...})
在 ajax 请求中。这终于让它工作了!
我创建了一个用作会员登录的 grails 网络应用程序,以便人们可以跟踪和更改他们的信息。
作为创建帐户时的一部分,文件从 ajax 请求发送到控制器。文件的字符串内容就是发送的内容
检查chrome中的网络流量显示数据发送正确。
请求中发送了3个文件,每个都是同一个文件,发送方式相同。
问题是当发送第三个文件时,参数到达controller action时没有解析到parameter map。它们可在 request.reader.text 获得。如果只发送了 2 个文件,那么它可以完美运行并且参数可用。
这曾经有效,我已经恢复了我在 UrlMappings 中所做的更改,但仍然没有成功。
我也增加了 maxRequestSize,但我认为请求大小只有大约 18Kb,所以这应该不是问题。
另一件事是我为使用 PUT 请求的用户提供了编辑功能。在那里做同样的事情时一切正常。 ajax 个请求是相同的,一个只使用 PUT,另一个 POST.
下面是我的 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
]
}
阅读更多内容后,您不能总是依赖被解析为参数的信息。它应该只真正用于 url 参数。
我决定改为尝试让它与 request.JSON 一起使用,因为这是从 post 请求正文中检索信息的更好方法。
只是将 Content-Type 更改为 application/json 是行不通的。我也必须做
data: JSON.stringify({...})
在 ajax 请求中。这终于让它工作了!