2013-08-02 2 views
1

Я пытаюсь отправить массив JSON из браузера в Java Servlet по методу PUT.Как получить параметр из запроса 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 encoded .. и т. Д.).

Итак, что мне делать, чтобы правильно отправлять массив JSON через метод PUT?

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

Если я m Неправильно HTTP PUT предназначен для размещения ресурса в данном URI, поэтому сервер должен взять тело команды и «сохранить» его. Если сервер получает запрос GET с тем же URI, эти данные должны быть возвращены. См. 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 
Смежные вопросы