Почему я потерял свой параметр? - PullRequest
1 голос
/ 29 августа 2011

У меня есть запрос jsoncallback процесса сервлета. Сервер использует getQueryString получил это

"jsoncallback=jQuery16208276397785205389_1314579791091&pams={%27title%27:%27%u56DE%u590D%uFF1Afoo%27,%27tag%27:%27%27,%27content%27:%27TEST%27,%27Friedly%27:%27%27,%27IsPrivate%27:%27%27,%27Contact%27:%27%27,%27base%27:5197}&_=1314579902441"

Но когда я использую

rqs = req.getParameter("pams");

отладчик показывает, что rqs равен нулю. но это работает

jsoncallback = req.getParameter("jsoncallback");

Формат кажется правильным. Почему я не могу получить параметр pams?

    String rqs = req.getQueryString();
    if (rqs != null) {
        if (req.getParameterMap().containsKey("jsoncallback")) {
            rqs = req.getParameter("pams");
            jsoncallback = req.getParameter("jsoncallback");
        }
        QS = URLDecoder.decode(rqs, "UTF-8");
    }

1 Ответ

2 голосов
/ 29 августа 2011

Это потому, что он неправильно URL-кодированный . Эти скобки, двоеточия и запятые запрещены в URL. Я понимаю, что ваша строка JSON изначально выглядит так, верно?

var json = {
    'title': '回复:foo',
    'tag': '',
    'content': 'TEST',
    'Friedly': '',
    'IsPrivate': '',
    'Contact': '',
    'base': 5197
};

(что на самом деле неверно JSON, эти одинарные кавычки должны были быть двойными)

Сначала вам нужно сериализовать JSON в строку. Строковое представление JavaScript должно выглядеть так:

var jsonString = '{"title":"回复:foo","tag":"","content":"TEST","Friedly":"","IsPrivate":"","Contact":"","base":5197}';

(ради полноты я исправил недействительные одинарные кавычки)

Как добраться до этого формата оставлено для вас в качестве упражнения. JSON-js полезен в этом.

Затем вы должны были использовать JavaScript-функцию encodeURIComponent(), чтобы URL-кодировать ее в правильный формат значения параметра HTTP-запроса:

var urlEncodedJsonString = encodeURIComponent(jsonString);

, что должно привести к этому значению

%7B%22title%22%3A%22%E5%9B%9E%E5%A4%8D%EF%BC%9Afoo%22%2C%22tag%22%3A%22%22%2C%22content%22%3A%22TEST%22%2C%22Friedly%22%3A%22%22%2C%22IsPrivate%22%3A%22%22%2C%22Contact%22%3A%22%22%2C%22base%22%3A5197%7D

Наконец, вы можете включить это значение в строку запроса вашего HTTP-запроса, и вы сможете использовать getParameter() обычным способом (а затем передать его в какой-нибудь синтаксический анализатор JSON, например Gson, чтобы получить полноценный объект Java из него) , Обратите внимание, что вам не нужно вручную URL-декодировать его. Servlet API сделает это за вас, когда вы используете getParameter() для получения отдельного параметра вместо того, чтобы вручную анализировать строку запроса из getQueryString(). Этот вызов Map#containsKey() также совершенно не нужен, просто получите параметр getParameter(). Если это null, то оно просто не было отправлено, иначе оно есть.

...