我从https://developers.google.com/appengine/docs/java/endpoints/的教程中学习了Google端点。我将Endpoint成功部署到Google App Engine,并设法构建一个调用Endpoint的简单iPhone应用程序。但是,我的iPhone应用程序在尝试调用端点时收到以下错误:
错误NSError * domain:@" com.google.GTLJSONRPCErrorDomain" - 代码:-32099 0x00000001094518a0
_userInfo __NSDictionaryI * 3键/值对0x00000001094452b0
[0](null)@"错误" :@" java.lang.IndexOutOfBoundsException:索引:0,大小:0"
[1](null)@" NSLocalizedFailureReason" :@"(java.lang.IndexOutOfBoundsException:Index:0,Size:0)"
[2](null)@" GTLStructuredError" :(没有摘要)
- (IBAction)myButton:(id)sender {
NSInteger myId;
if (self.mySwitch.isOn) {
myId = 0;
}
else {
myId = 1;
}
GTLQueryHelloworld *query = [GTLQueryHelloworld queryForGreetingsGetGreetingWithIdentifier:myId];
[self.helloWorldService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {
if (!error) {
[self.myLabel setText:object];
}
else {
[self.myLabel setText:[error description]]; // This line gets called
}
}];
}
我在Youtube video upload fails after 100 % progress for some users with Backend Error code:-32099中发现了相同的错误消息,但这与调用YouTube有关,最终因错误而被关闭。所以我认为它并不相关。
我相信这个错误是在客户端,因为我在服务器(Java)上放了一些日志,但它似乎没有被调用:
public class Greetings {
private static final Logger log = Logger.getLogger(Greetings.class.getName());
public static ArrayList<HelloGreeting> greetings = new ArrayList<HelloGreeting>();
static {
log.setLevel(Level.INFO);
greetings.add(new HelloGreeting("hello world!"));
greetings.add(new HelloGreeting("goodbye world!"));
}
public HelloGreeting getGreeting(@Named("id") Integer id) {
log.info("HelloGreeting called with getGreeting");
log.info("getGreeting id " + id);
return greetings.get(id);
}
我没有看到&#34; HelloGreeting呼叫getGreeting&#34;在我的Google服务器日志中,我看到的只是日志消息,表明我的Endpoint项目已成功部署:
21:56:45.639终点:https://1-war-dot-firstendpointproject.appspot.com/_ah/api/helloworld@v1已保存
我还确认我可以从已部署的API资源管理器中为我的项目成功测试helloworld.greetings.getGreeting API:
https://1-war-dot-firstendpointproject.appspot.com/_ah/api/explorer
当我从资源管理器调用API时,它会生成一条日志消息:
24.130.150.54 - - [19 / Jun / 2014:21:17:45 -0700]&#34; POST /_ah/spi/com.google.appengine.samples.helloendpoints.Greetings.getGreeting HTTP / 1.1& #34; 200 93&#34; https://1-war-dot-firstendpointproject.appspot.com/ah/api/static/proxy.html?jsh=m%3B%2F%2Fscs%2Fapps-static%2F_%2Fjs%2Fk%3Doz.gapi.en.htta44JhPmg.O%2Fm%3D__features__%2Fam%3DAQ%2Frt%3Dj%2Fd%3D1%2Fz%3Dzcms%2Frs%3DAItRSTPk1CJ1YqUCyb-H-zhkQTjKPZwvbQ&#34; &#34; Mozilla / 5.0(Macintosh; Intel Mac OS X 10_9_3)AppleWebKit / 537.75.14(KHTML,与Gecko一样)Version / 7.0.3 Safari / 537.75.14&#34; &#34; 1-war-dot-firstendpointproject.appspot.com&#34; ms = 17 cpu_ms = 87 cpm_usd = 0.000010 instance = 00c61b117ce13f56d6eb483511c2c1bcd24241 app_engine_release = 1.9.6
它不会生成&#34;通过getGreeting调用HelloGreeting&#34;但我怀疑是因为我没有配置记录器。无论如何,当我的客户端调用端点时,我根本得不到任何日志消息。由于API资源管理器调用至少会生成1条日志消息,因此我怀疑问题出在客户端上。
问题:
1]我在客户端或服务器端看到的错误是什么?
2]你知道这个错误引用的是什么数组吗?
3]调试这样的连接问题有哪些技巧?
感谢您帮助StackOverflowers!
迈克尔
答案 0 :(得分:3)
我认为正在发生的事情如下:服务器遇到意外情况(特别是:它抛出了一个无法使用的IndexOutOfBoundsException
),因此它无法返回生成的客户端存根在其中所期望的那种JSON HTTP响应(具体为:它返回HTTP状态500而不是2xx)。客户端存根将此报告为NSError
,域名为com.google.GTLJSONRPCErrorDomain
,代码为32099. JSON-RPC 2.0规范将此错误代码定义为“为实现定义的服务器错误保留”。
似乎处理此问题的最佳方法是在服务器端或客户端添加适当的异常处理,具体取决于究竟是什么原因导致服务器上的意外情况。服务器最有可能处理IndexOutOfBoundsException
,因为它可能源于应用程序级错误。
所以回答逐字问题:(原始)错误在服务器上。顺便说一下,与OP不同,我确实在Google Developers Console中看到了相关的JUL日志记录输出。
答案 1 :(得分:1)
我查看了你的端点并成功地在资源管理器中调用了它并使用curl。我很确定问题出在客户端,服务器不理解请求。
如果您确定正确调用客户端,我会尝试重新生成它。也许自上次生成以来一直存在错误修正。