Google云端点生成的iOS客户端无法正常工作

我有一个使用GAE Python SDK 1.8.3在本地运行的python webservice。 使用Google Cloud Endpoints服务生成器注释API并生成iOS客户端类后,我试图使用它调用远程过程。

如果我使用API​​ Explorertesting我的API,一切正常。

当我使用iOS客户端进行呼叫时,该呼叫被web服务接收,但是该请求不能被正确解码。 这是我第一次使用Endpoints API,所以我不知道什么是错的。

似乎正在发生的事情是,我的请求对象被包装在查询JSON中的“资源”键中。 现在,当我的web服务试图解码它,它会产生一个警告说:“找不到无法识别的字段:资源的变种”。 而且,由于我的对象被封装在这个密钥中,所以它被跳过并且不会被解码成消息。

当使用API​​ Explorer进行调用时,对象不被包装,所以一切正常。

这是我在我的web服务中做的事情:

@endpoints.method(SearchRequest, ContactListResponse, path='search', http_method='post', name='api.search') def search(self, request): user = request.user number = request.number 

这是我从iOS调用它的方式:

 GTLMyAPIMessagesSearchRequest * request = [[GTLMyAPIMessagesSearchRequest alloc] init]; request.user = @"+552199881234"; request.number = @"+5521717171"; GTLQueryMyAPI *query = [GTLQueryMyAPI queryForApiSearchWithObject:request]; [service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLMyAPIMessagesContactListResponse* object, NSError *error) { NSArray* contacts = object.contacts; } 

我在这里做了什么难以置信的错误?

这不是一个好的解决scheme,而是现在的补丁。 进行iOS端点本地主机testing时遇到同样的问题。 但是,当我使用已部署的后端,我删除这条线,一切都很好。

  auth.shouldAuthorizeAllRequests = YES; 

只有当我添加上面的行以使用本地主机时,才会发生“资源”密钥包装问题。 所以今天上午我没有使用本地主机,只是部署版本。 让我知道你是否解决了这个问题。 :)显然指向部署的版本不是首选的testing。

这是一个从iOS到端点进行本地testing的恼人的错误。 我希望他们尽快修复。 🙂

顺便说一句,而不是修改QGTQueryMyAPI.m(这是一个生成的文件)。 我只是在创build查询之后进行Theo的修复。 因此,所有发送数据的查询都是这样的(我也设置了一个标志从本地主机切换到其他地方部署)。

 GTLQueryMyApi *query = [GTLQueryMyApi queryForSearchWithObject:someGtlObject]; if (LOCAL_HOST_TESTING) { [query setJSON:someGtlObject.JSON]; } 

好的! user2697002的答案告诉我,这个工作时,部署的web服务。

为了发展正常工作,这是我做的解决方法。

生成的API使用这样的模板来处理GTLQueryMyAPI.m中的所有查询

 + (id)queryForSearchWithObject:(GTLMyAPIMessagesSearchRequest *)object { if (object == nil) { GTL_DEBUG_ASSERT(object != nil, @"%@ got a nil object", NSStringFromSelector(_cmd)); return nil; } NSString *methodName = @"myapi.search"; GTLQueryMyAPI *query = [self queryWithMethodName:methodName]; query.bodyObject = object; query.expectedObjectClass = [GTLMyAPIMessagesContactListResponse class]; return query; } 

为了在开发服务器上工作,可以replace所有这些行

 query.bodyObject = object; 

 query.JSON = object.JSON; 

这会停止将JSON包装在“资源”字段中。 不知何故,我相信这不应该在部署发布版本上完成。

我仍然在试验,但相信这是正确的方式(迅速)设置本地主机上testing….

 let _service = GTLServiceBackendAPI(); _service.allowInsecureQueries = true; _service.isRESTDataWrapperRequired = false; _service.retryEnabled = true; _service.fetcherService.allowLocalhostRequest = true; _service.rpcURL = NSURL(string: "http://localhost:8080/_ah/api/rpc?prettyPrint=true") 
Interesting Posts