0

以下を期待するサーバー API と対話するように RestKit を構成する必要があります。

  • すべてのリクエストは multipart/form-data にあります
  • JSON ペイロードがあります。ただし、クライアントはペイロードをフォームデータ文字列に折りたたんで、先頭に「json=」を追加する必要があります
  • 認証は、JSON ペイロードのコンテンツを GET パラメーターを含む URL でハッシュすることによって行われます。そして、このハッシュを URL に追加します (はい、これが悪いことはわかっています。しかし、API を制御することはできません)。

RestKit にシリアライゼーション出力を json= に追加させ、RKObjectLoader をコンピューターに変更し、正しい署名ハッシュを追加しようとしています。

RKObjectManager をサブクラス化し、sendObject:toResourcePath:usingBlock: をオーバーライドして、HTTPBody をオーバーライドしようとしました。しかし、これを機能させることはできません。RKClient と configureRequest: のサブクラス化も試みましたが、このメソッドはオブジェクトのシリアル化の前に呼び出されるようです。

これは、RestKit を使用する最初の日です。助けていただければ幸いです。ありがとう!

4

1 に答える 1

0

更新: 最初に説明した底とは異なる解決策を考え出しました。RKObjectLoader と RKObjectManager のサブクラスを作成しました。カスタム オブジェクト マネージャには、カスタム オブジェクト ローダーを返すための変更が 1 つあるだけです。カスタム構築を実行するために、オブジェクト ローダーの送信メッセージがオーバーライドされました。

これが私が解決した解決策です。

オーバーライドする RKClient のサブクラスを使用します

- (void)configureRequest:(RKRequest *)request {
  [super configureRequest:request];
  request.delegate = self;
}

そして、デリゲートですべてのエンコード/署名を行います。

- (void)requestWillPrepareForSend:(RKRequest *)request {
  [self encodeJSONPayloadForRequest:request];
  [self signRequest:request];
}

- (void)encodeJSONPayloadForRequest:(RKRequest*)request {
  NSDictionary * bodyDict = (NSDictionary*)request.params;
  NSError * error = nil;
  NSString * jsonString = [bodyDict JSONStringWithOptions:JKSerializeOptionNone error:&error];
  if (error) NSAssert(false, @"error serializing into JSON");
  NSDictionary * dictionary = [NSDictionary dictionaryWithObject:jsonString forKey:@"json"];
  request.params = dictionary;
}

既存のデリゲートにパススルーするためのメカニズムを実装する必要があります。ただし、このアプローチはうまくいくようです。

于 2012-10-04T22:29:51.430 に答える