0

このリンクhttps://github.com/RestKit/RestKit/wiki/Posting-NSDictionary-as-JSONをたどってjson投稿を作成し、サーバーからjson応答を取得します。オブジェクトのリストに対するjson応答の処理を続行するにはどうすればよいですか?

- (void)sendAsJSON:(NSDictionary*)dictionary {

    RKClient *client = [RKClient clientWithBaseURL:@"http://restkit.org"];        

    // create a JSON string from your NSDictionary 
    id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON];
    NSError *error = nil;
    NSString *json = [parser stringFromObject:dictionary error:&error];

    // send your data
    if (!error)
        [[RKClient sharedClient] post:@"/some/path" params:[RKRequestSerialization serializationWithData:[json dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON] delegate:self];

}


- (void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response
{
    NSLog(@"after posting to server, %@", [response bodyAsString]);
}

EDIT1 :これは私がサーバーにPOSTしたいJsonです。

{
    "memberId": "1000000",
    "countryCode": "US",
    "contacts": [
        {
            "phoneNumber": "+12233333333",
            "memberId": "2222",
            "contactId": "123456",
            "name": "john"
        },
        {
            "phoneNumber": "+12244444444",
            "memberId": "3333",
            "contactId": "123457",
            "name": "mary"
        }
    ]
}

EDIT2:誰かが実際に別のスレッドでこれを解決しました。 https://stackoverflow.com/a/7726829/772481

4

2 に答える 2

4

POSTを実行するには、RKClientの代わりにRKObjectMangerを使用します。次に、このメソッドが呼び出されたときに、応答をオブジェクトにロードできます。

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects

編集(サーバーに送信するJSONを指定):

現在行っている方法でJSONを作成する代わりに、カスタムモデルクラスを作成できます。

まず、最上位オブジェクトのモデルクラスを作成できます(Userと呼ばれると仮定します)。

ユーザーヘッダー

//  User.h

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic) int memberId;
@property (nonatomic, copy) NSString *countryCode;
@property (nonatomic, strong) NSArray *contacts;

@end

ユーザーの実装

//  User.m

#import "User.h"

@implementation User

@synthesize memberId;
@synthesize countryCode;
@synthesize contacts;

@end

次に、Contactというモデルクラスを作成できます。

連絡先ヘッダー

//  Contact.h

#import <Foundation/Foundation.h>

@interface Contact : NSObject

@property (nonatomic, strong) NSString *phoneNumber;
@property (nonatomic) int memberId;
@property (nonatomic) int contactId;
@property (nonatomic, strong) NSString *name;

@end

連絡先の実装

//  Contact.m

#import "Contact.h"

@implementation Contact

@synthesize phoneNumber;
@synthesize memberId;
@synthesize contactId;
@synthesize name;

@end

これらのクラスは次のように使用できます。

Contact *john = [[Contact alloc] init];
john.phoneNumber = @"+12233333333";
john.memberId = 2222;
john.contactId = 123456;
john.name = @"john";

Contact *mary = [[Contact alloc] init];
mary.phoneNumber = @"+12244444444";
mary.memberId = 3333;
mary.contactId = 123457;
mary.name = @"mary";

User *user = [[User alloc] init];
user.memberId = 1000000;
user.countryCode = @"US";
user.contacts = [NSArray arrayWithObjects:john, mary, nil];

RKObjectMapping *contactsMapping = [RKObjectMapping mappingForClass:[Contact class]];
[contactsMapping mapKeyPath:@"phoneNumber" toAttribute:@"phoneNumber"];
[contactsMapping mapKeyPath:@"memberId" toAttribute:@"memberId"];
[contactsMapping mapKeyPath:@"contactId" toAttribute:@"contactId"];
[contactsMapping mapKeyPath:@"name" toAttribute:@"name"];

RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[User class]];
[objectMapping mapKeyPath:@"memberId" toAttribute:@"memberId"];
[objectMapping mapKeyPath:@"countryCode" toAttribute:@"countryCode"];
[objectMapping mapKeyPath:@"contacts" toRelationship:@"contacts" withMapping:contactsMapping];

//Then you set up a serialization mapping and object mapping and POST it

//This method takes care of both the serialization and object mapping
[[RKObjectManager sharedManager].mappingProvider registerMapping:objectMapping withRootKeyPath:@"user"]; 

//POST it
[[RKObjectManager sharedManager] postObject:user delegate:self];

シリアル化マッピングとPOSTの実行方法を説明する前に、期待しているJSON応答の種類を知る必要があります。

編集(サーバーから返されたJSONを指定)

シリアル化マッピングとオブジェクトマッピングを設定してPOSTするには、リソースパスを設定する必要があります(アプリを起動するときに行います)。

RKObjectRouter *router = [RKObjectManager sharedManager].router;
[router routeClass:[User class] toResourcePath:@"/users" forMethod:RKRequestMethodPOST];

リソースパスは「/users」以外のものである可能性があります。

コメントの下のコードを見てください//Then you set up a serialization mapping and object mapping and POST it。ここでは、シリアル化マッピング、オブジェクトマッピング、およびPOSTを追加しました。

于 2012-07-04T01:30:11.353 に答える
0

通常、この状況では、@ill_always_be_a_warriorsが言ったRKObjectLoaderようにアクセスできるを使用します。RKObjectManagerこれを使用する理由は、構成されている場合は無料のオブジェクトマッピングが含まれているためです。注意すべきことの1つは、JSONではなく「オブジェクト」を直接投稿することです。詳細については、RestKitの例を見て、これを行う方法を確認してください。それでも問題が解決しない場合は、ここに質問を投稿してください。

于 2012-07-04T06:54:26.947 に答える