【问题标题】:Google App Engine Java - for POST params, request.getParameter returns null when deployed, but works locallyGoogle App Engine Java - 对于 POST 参数,request.getParameter 在部署时返回 null,但在本地工作
【发布时间】: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方法了吗?

标签: iphone ios google-app-engine jakarta-ee nsurlconnection


【解决方案1】:

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

【讨论】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多