为什么我丢失参数?

时间:2011-08-29 01:13:53

标签: javascript json servlets query-string

我有一个servlet进程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为null。 但这有效

jsoncallback = req.getParameter("jsoncallback");

格式似乎正确。为什么我不能让pams获得'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 个答案:

答案 0 :(得分:2)

那是因为它不正确URL-encoded。这些大括号,冒号和逗号在URL中是非法的。我知道你的JSON字符串最初看起来像这样,对吗?

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

(实际上是invalid JSON,那些单引号应该是双引号)

首先需要将JSON序列化为String。 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解码。当您使用getParameter()获取单个参数而不是从getQueryString()手动解析查询字符串时,Servlet API将为您执行此操作。 Map#containsKey()调用也完全没必要,只需通过getParameter()获取参数即可。如果它是null,那么它就不会被发送,否则它就在那里。