java - 这是服务器或客户端上的 Google Endpoints 错误吗?

标签 java xcode google-app-engine google-cloud-endpoints google-cloud-platform

我一直在通过 https://developers.google.com/appengine/docs/java/endpoints/ 上的教程学习 Google Endpoints .我将 Endpoint 成功部署到 Google App Engine,并设法构建了一个调用 Endpoint 的简单 iPhone 应用程序。但是,我的 iPhone 应用程序在尝试调用端点时出现以下错误:

错误信息

错误 NSError * 域:@"com.google.GTLJSONRPCErrorDomain"- 代码:-32099 0x00000001094518a0

_userInfo __NSDictionaryI * 3 键/值对 0x00000001094452b0

[0] (null) @"error": @"java.lang.IndexOutOfBoundsException: Index: 0, Size: 0"
[1] (null) @"NSLocalizedFailureReason": @"(java.lang.IndexOutOfBoundsException: Index: 0, Size: 0)"
[2] (null) @"GTLStructuredError": (无摘要)

iPhone API 调用程序(在 Xcode 调试器中运行的 Objective-C 中)

- (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);
    }

我在我的 Google 服务器日志中没有看到“HelloGreeting called with getGreeting”,我看到的只是表明我的 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] "POST/_ah/spi/com.google.appengine.samples.helloendpoints.Greetings.getGreeting HTTP/1.1"200 93 "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 ""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14""1-war-dot-firstendpointproject.appspot. com"ms=17 cpu_ms=87 cpm_usd=0.000010 instance=00c61b117ce13f56d6eb483511c2c1bcd24241 app_engine_release=1.9.6

它不会生成“使用 getGreeting 调用的 HelloGreeting”,但我怀疑这是因为我没有配置记录器。无论如何,当我的客户调用端点时,我根本没有收到任何日志消息。由于 API 浏览器调用至少生成 1 条日志消息,我怀疑问题出在客户端上。

问题:

1] 我看到的错误是在客户端还是服务器端生成的?

2] 你知道这个错误指的是什么数组吗?

3] 调试此类连接问题的技巧有哪些?

感谢您对 StackOverflowers 的帮助!

迈克尔

最佳答案

我认为发生的事情如下:服务器遇到意外情况(具体来说:它抛出一个未处理的 IndexOutOfBoundsException),因此它无法返回生成的客户端 stub 的 JSON 类型期望在其 HTTP 响应中(具体来说:它返回 HTTP 状态 500 而不是 2xx)。客户端 stub 将此报告为 NSError,域为 com.google.GTLJSONRPCErrorDomain,代码为 32099。JSON-RPC 2.0规范将此错误代码定义为“为实现定义的服务器错误保留”。

处理这个问题的最佳方法似乎是在服务器端或客户端添加适当的异常处理,具体取决于在服务器上造成意外情况的确切原因。 IndexOutOfBoundsException 最有可能由服务器处理,因为它可能源于应用程序级错误。

所以要逐字回答问题:(原始)错误在服务器上。顺便说一句,与我看到相关的 OP 不同 JUL在 Google Developers Console 中记录输出。

关于java - 这是服务器或客户端上的 Google Endpoints 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24319938/

相关文章:

java - 如何使用 POST 将 Array 发送到 REST-Service (Jersey)

ios - xcode 调试器不显示值

xcode - 从Localizable.strings中删除未使用的资源

java - 限制对 AppEngine 上的 JRE 库类的访问的目的是什么?

JAVA_HOME 没有指向 JDK : Unable to start google app engine

java - Google App Engine(或更一般地在分布式服务器环境中)中的单例如何工作?

java - 将 System.in 包装在 BufferedInputStream 中可以提高某些 JDK 的性能吗?

java - 将图像旋转 90 度或倍数的更快方法

IntelliJ IDEA 中的 Java 和 Maven : How to properly import a dependency

xcode - Swift,Equatable 协议(protocol)错误?