我试图通过PUT方法将浏览器中的JSON数组发送到Java Servlet。
我的ajax请求:
$.ajax({
url : "./manageShoppingCart",
data : {
jsonArray : JSON.stringify(itemsArray)
},
type : 'PUT',
contentType : 'application/json'
}).done(function(rsp) {
console.log("done" + rsp);
}).fail(function(err) {
console.log("fail" + err);
});
on on server是(在doPut方法中):
String jsonArray = request.getParameter("jsonArray"); // this is null
// but if I read from request stream I get the data
ServletInputStream inputStream = request.getInputStream();
String string = convertStreamToString(inputStream);
System.out.println(string); // jsonArray=%5B%7B%22itemId%22%3A%228003%22%2C%22itemQuantity%22%3A%2210%22%7D%2C%7B%22itemId%22%3A%228004%22%2C%22itemQuantity%22%3A%222%22%7D%5D
有趣的是,如果更改方法并发送为POST,我会正确获取参数。
我的猜测是Tomcat 6需要一些设置才能通过PUT获取参数(url编码等等)。
那么,我应该怎样做才能通过PUT方法正确发送JSON数组?
更新: 我不确定这是否是正确的方法,但对我来说,我发现自己编写一个从消息到参数的转换器很容易:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletInputStream;
public class RequestsService {
public static String getDecodedMessage(ServletInputStream inputStream) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
String bodyMessageEncoded;
bodyMessageEncoded = bf.readLine();
String message = URLDecoder.decode(bodyMessageEncoded, "UTF-8");
return message;
}
public static String getParameter(String url, String paramName) throws ArrayIndexOutOfBoundsException {
Pattern pattern = Pattern.compile(paramName + "=[^&]*"); // regex for "paramName='anything unless is &'"
Matcher matcher = pattern.matcher(url);
matcher.find();
String value = matcher.group().split("=")[1];
return value;
}
public static String getParameterFromStream(ServletInputStream inputStream, String paramName) throws IOException {
String decodedMessage = getDecodedMessage(inputStream);
return getParameter(decodedMessage, paramName);
}
}
答案 0 :(得分:2)
如果我没错,HTTP PUT意味着将资源放在给定的URI中,因此服务器应该接受命令的主体并“存储”它。如果服务器收到具有相同URI的GET请求,则应返回这些数据。有关详细信息,请参阅Servlet parameters and doPut。
我会尝试类似的事情:
$.ajax({
url : "./manageShoppingCart",
data : JSON.stringify(itemsArray), //just the data, no parameter name
type : 'PUT',
contentType : 'application/json'
}).done(function(rsp) {
console.log("done" + rsp);
}).fail(function(err) {
console.log("fail" + err);
});
然后只需获取正文中的数据并将其解析为服务器端的JSON对象:
ServletInputStream inputStream = request.getInputStream();
String string = convertStreamToString(inputStream);
JSONObject jsonArray= new JSONObject(string); //Maybe a JSONArray suits better here