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")