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

时间:2012-06-12 00:41:46

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

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

App Engine代码:

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过滤器,可能会修改请求吗?

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

2 个答案:

答案 0 :(得分:1)

我认为GAE servlet实现因为你在身体中同时包含Url参数(access_token)和表单参数而感到困惑。

答案 1 :(得分:1)

问题最终成为GAE AppSpot服务器在向http而不是https发出请求时正在执行的重影/隐藏重定向。由于我没有在重定向时手动处理创建/修改新请求,因此正文和帖子参数都丢失了,因此服务器永远无法检索它。

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