簡體   English   中英

Google Cloud Endpoints生成的iOS客戶端無法正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM