0

GAE Python SDK 1.8.3 を使用してローカルで実行されている Python Web サービスがあります。API に注釈を付け、Google Cloud Endpoints Service Generator を使用して iOS クライアント クラスを生成した後、それを使用してリモート プロシージャを呼び出そうとしています。

API Explorer を使用して 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;
}

ここで信じられないほど間違ったことをしていますか?

4

4 に答える 4

0

大丈夫!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 が「リソース」フィールドにラップされなくなります。どういうわけか、これは展開リリース バージョンで行うべきではないと思います。

于 2013-08-20T14:05:40.043 に答える