[英]Google Cloud Endpoints generated iOS Client not working
我有一個使用GAE Python SDK 1.8.3在本地運行的python網絡服務。 在對API進行注釋並使用Google Cloud Endpoints Service Generator生成iOS客戶端類之后,我嘗試使用它來調用遠程過程。
如果我使用API Explorer測試我的api,那么一切都會很好。
當我使用iOS客戶端進行呼叫時,網絡服務會收到呼叫,但是無法正確解碼請求。 這是我第一次使用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;
}
我在這里做錯什么嗎?
這是從iOS到Endpoints進行本地測試的煩人漏洞。 我希望他們盡快解決。 :)
BTW而不是修改QGTQueryMyAPI.m(這是一個生成的文件)。 我在創建查詢后立即進行Theo的修復。 因此,我所有發送數據的查詢都看起來像這樣(我也設置了一個標志,也可以從本地主機切換到部署在其他地方)。
GTLQueryMyApi *query = [GTLQueryMyApi queryForSearchWithObject:someGtlObject];
if (LOCAL_HOST_TESTING) {
[query setJSON:someGtlObject.JSON];
}
這不是一個很好的解決方案,但現在是一個補丁。 在進行iOS端點本地主機測試時,我遇到相同的問題。 但是,當我使用部署的后端時,我刪除了這一行,一切都很好。
auth.shouldAuthorizeAllRequests = YES;
僅當我添加以上行以使用localhost時,才會發生“資源”密鑰包裝問題。 因此,今天上午,我不使用本地主機,而只是使用已部署的版本。 讓我知道您是否解決了該問題。 :)顯然,不建議使用已部署的版本進行測試。
好的! 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;
}
為了在開發服務器上工作,可以替換所有這些行
query.bodyObject = object;
同
query.JSON = object.JSON;
這樣就可以將JSON包裝在“資源”字段中。 我以某種方式認為不應在部署發行版上執行此操作。
我仍在嘗試,但相信這是在本地主機上進行測試的正確方法(快速)。
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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.