我目前正在Angular JS
+ Java
开发小项目,用户使用rest webservice在他的个人资料图片中注册他的信息。除了特殊字符(Ä Ö Ü ä ö)
之外,一切正常。
Java:
@POST
@Path("add_employee")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response addEmployee(MultipartFormDataInput input) {
try {
Map<String, List<InputPart>> formDataMap = input.getFormDataMap();
if (formDataMap != null && !formDataMap.isEmpty()) {
InputPart inputPart = formDataMap.get("EmployeeProxy").get(0);
ObjectMapper mapper = new ObjectMapper();
//receiving wrong json below=>
EmployeeProxy admbo = mapper.readValue(inputPart.getBodyAsString(), EmployeeProxy.class);
List<InputPart> profilePic = formDataMap.get("profilePic");
.
.
.
} else {
return Response.status(Response.Status.NOT_FOUND).build();
}
} catch (Exception ex) {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
}
Angular JS:
var fd = new FormData();
fd.append('EmployeeProxy', angular.copy(JSON.stringify($scope.empInfo)));
fd.append('profilePic', $scope.myFile);
$http.post(Server.url + 'add_employee', fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).then(function (response) {
});
发送Json:{“empName”:“ÄÖÜäö”,“empSurname”:“XYZ”,“emailId”: “abc@gmail.com”}
收到Json:{“empName”:“ ”,“empSurname”: “XYZ”,“emailId”:“abc@gmail.com”}
请在下面的图片中找到请求标题信息:
如果我使用的APPLICATION_JSON
没有MULTIPART_FORM_DATA
。
答案 0 :(得分:2)
如果您的内容类型标头为undefined
,则RestEasy
无法识别要使用的字符集,并且会回退到默认值(us-ascii
)。
另请参阅:Overwriting the default fallback content type for multipart messages
阅读后编辑:它应该是指定Content-Type的多部分正文,以便RestEasy
解析各个字符串。
In the documentation of FormData可以通过以下方式完成:
Angular JS:
fd.append('EmployeeProxy', new Blob([angular.copy(JSON.stringify($scope.empInfo))], { type: "text/plain; charset=iso-8859-1"}));
Java:
String json = IOUtils.toString(inputPart.getBody(InputStream.class, null), StandardCharsets.UTF_8);
EmployeeProxy admbo = mapper.readValue(json, EmployeeProxy.class);