2013-08-02 4 views
1

브라우저에서 PUT 메소드의 Java Servlet으로 JSON 배열을 보내려고합니다.PUT 요청에서 매개 변수를 가져 오는 방법은 무엇입니까?

내 아약스 요청 : 서버에서

$.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 배열을 올바르게 보내려면 어떻게해야합니까?

UPDATE : 나는이 그것을 할 수있는 올바른 방법인지 잘 모르겠지만, 나를 위해 내가 쉽게 자신에게 메시지에서 매개 변수 컨버터 작성 찾을 :

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

답변

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 
관련 문제