我有一个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");
}
答案 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
,那么它就不会被发送,否则它就在那里。