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 - 基于域的重定向