【问题标题】:How to get parameter from a PUT request?如何从 PUT 请求中获取参数?
【发布时间】:2013-08-03 16:53:07
【问题描述】:

我正在尝试将 JSON 数组从浏览器发送到 Java Servlet on PUT 方法。

我的 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);
});

服务器上的一个是(在 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);
}
}

【问题讨论】:

    标签: jakarta-ee servlets tomcat6


    【解决方案1】:

    如果我没记错的话,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 2012-01-17
      相关资源
      最近更新 更多