1

JSON 配列をブラウザから PUT メソッドの Java サーブレットに送信しようとしています。

私の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 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);
}
}
4

1 に答える 1