13

Restkit を使用して REST with JSON を介して Web サーバーと通信する iOS アプリを作成しています

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:path delegate:self] を使用して、Web サービスからオブジェクトを JSON として取得し、それを obj-c オブジェクトにマップすると、正常に動作します

今私は使用しようとしています: [[RKObjectManager sharedManager] putObject:obj delegate:self]; この呼び出しは、オブジェクトを JSON ではなくフォーム エンコードとして Web サービスに送信します。

私の質問は次のとおりです。フォームエンコードの代わりにコンテンツタイプJSONで送信するようにsharedManager(またはルーター?)を構成する方法。

どんなコード例でも大歓迎です。

どうも!

4

5 に答える 5

9

最も簡単な方法は、オブジェクト マネージャーを初期化するときに次のようにプロパティを設定することです。

RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:@"http://url.com"];
objectManager.serializationMIMEType = RKMIMETypeJSON;
于 2011-08-12T01:31:42.897 に答える
3

Evan は正しいですが、ネストされた NSDictionay があるため、JSON 文字列を送信していることも確認する必要がありました。

JSON 文字列として送信したい辞書がある場合は、次のように実行できます。

// create a JSON string from your NSDictionary
NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict 
                                                   options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
                                                     error:&error];
NSString *jsonString = [[NSString alloc] init];
if (!jsonData) {
    NSLog(@"Got an error: %@", error);
} else {
    jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}

// make the post using the objectManager if you want to map the response to a model
RKObjectManager* objectManager = [RKObjectManager sharedManager];  
[objectManager loadObjectsAtResourcePath:@"/api/" delegate:self block:^(RKObjectLoader* loader) {
    loader.serializationMIMEType = RKMIMETypeJSON; // We want to send this request as JSON
    loader.objectMapping = [objectManager.mappingProvider objectMappingForClass:[Plan class]];
    loader.resourcePath = @"/api/";
    loader.method = RKRequestMethodPOST;
    loader.params = [RKRequestSerialization serializationWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON];
}];
于 2012-04-25T18:25:31.890 に答える
1

さて、それを行う方法を見つけました:

RKRouter.h をサブクラス化するか、RKDynamicRouter.m を変更するだけです

return [object propertiesForSerialization];

[RKJSONSerialization JSONSerializationWithObject:[object propertiesForSerialization]];

RestKit は putObject 呼び出し用の JSON を生成します

于 2011-03-16T04:43:32.047 に答える
0

RKObjectManager をサブクラス化し、サブクラス化されたマネージャーで requestWithObject:method:path:parameters: の実装を変更することで、個々の要求のシリアル化 MIMEType を変更できます。

リクエストを送信:

SubclassedObjectManager *manager = ...
[manager putObject:nil
           path:pathString
     parameters:parameters
        success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
      } failure:^(RKObjectRequestOperation *operation, NSError *error) {
      }
 ];

PUT メソッドのリクエストの MIMEType を変更します。

- (NSMutableURLRequest *)requestWithObject:(id)object method:(RKRequestMethod)method path:(NSString *)path parameters:(NSDictionary *)parameters
{
  NSMutableURLRequest *request = [super requestWithObject:object method:method path:path parameters:parameters];
  if (method&RKRequestMethodPUT) {
    NSError *error = nil;
    NSData *serializedJSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error];
    [request setValue:RKMIMETypeJSON forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:serializedJSON];
  }

  return request;
}
于 2013-10-10T07:24:56.433 に答える