Google App Engine Java - 对于 POST 参数,request.getParameter 在部署时返回 null,但在本地工作

Posted

技术标签:

【中文标题】Google App Engine Java - 对于 POST 参数,request.getParameter 在部署时返回 null,但在本地工作【英文标题】:Google App Engine Java - for POST params, request.getParameter returns null when deployed, but works locally 【发布时间】:2012-06-12 00:41:46 【问题描述】:

我正在尝试通过 POST 从 iPhone 应用程序将参数发布到 Google App Engine 上的 Java servlet。当服务器在本地运行时,这可以正常工作,但是当它部署到 App Engine 时,参数始终为空。为什么?

App 引擎代码:

String facebookFriendTokens = (String) req.getParameter("facebookFriendTokens");
//running on localhost, facebookFriendTokens works fine, deployed to GAE it's always null
log.warning("Facebook friends = " + facebookFriendTokens);

iPhone 代码:

NSString *urlString = [NSString stringWithFormat:@"%@/new_huddle?access_token=%@", SERVER_URL, [defaults objectForKey:@"FBAccessTokenKey"]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
NSString *postString = [NSString stringWithFormat:@"facebookFriendTokens=%@&eventDate=%@&placesTokens=%@&name=%@", encodedFriendTokens, encodedDateString, placesQueryStringParm, encodedNameString];
[encodedNameString release];
[encodedDateString release];
[encodedFriendTokens release];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:request queue: ...

如果我将 request.getInputStream() 处理为字符串并打印它,它会按预期显示。我应该这样解析字符串吗?

另外,我确实有一个 servlet 过滤器,这可能会修改请求吗?

我想知道服务器是否正在发出重定向,因此我在后续请求中丢失了所有正文数据。我现在正在本地测试。

【问题讨论】:

回调地址正确吗? 是的,由常量驱动,所以没有改变。 例如,您没有 https 的代理设置。 我不这么认为,请求正在通过,并且 GET 参数工作正常。只有切换到 POST 会导致问题 你已经准备好GAE servlet#doPost方法了吗? 【参考方案1】:

我相信 GAE servlet 实现会因为您在正文中同时具有 Url 参数 (access_token) 和表单参数这一事实而感到困惑。

【讨论】:

好吧,我尝试将 access_token 移动到正文中,但没有成功。从字面上看,部署代码上的任何 request.getParameter 都不起作用!找不到参数。 另一种可能性是您在尝试通过 getParameter() 获取参数之前正在使用请求正文(=调用 getInputStream()getReader())。 我绝对不会那样做,我应该这样做吗?请记住,这在本地有效! 尝试创建一个有此错误的最小示例并将其发布在此处(或其他地方,例如 pastebin)。那我们就可以看看了。【参考方案2】:

问题最终是 GAE AppSpot 服务器在向 http 而不是 https 发出请求时执行的幽灵/隐藏重定向。由于我没有在重定向时手动处理创建/修改新请求,因此 body 和 post 参数会丢失,因此服务器永远无法检索到。

只需在客户端将 url 从 http 更改为 https 即可解决问题。

【讨论】:

以上是关于Google App Engine Java - 对于 POST 参数,request.getParameter 在部署时返回 null,但在本地工作的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine (Java) + Spring 管理的 PersistenceManager

在 Google App Engine/Java 中实现通配符搜索

Google-App-Engine 上的 Grails - 它死了吗? [关闭]

google app engine java - 基于域的重定向

在单个 Google App Engine 项目中同时使用 Java 和 Python

在 Google App Engine (Java) 中使用 Cron 执行后端