-1

私の現在のプロジェクトでは、REST ベースの Web サービスを呼び出す必要があります。私の同僚は、json 形式でデータを返す単純な Web サービス (nodeJS & Express Framework) を作成しました。を使用して呼び出すことに成功しましたNSUrlConnection。今、私の同僚は認証をサービスに適用しました。最初にAFNetworking 、次にNSUrlConnectionRestKitを使用してみましたが、成功しませんでした。

RestKit の検索チュートリアルが古い (RestKit バージョン 0.10) か、認証チュートリアルが利用できない。私がやりたいことは、資格情報を使用して単純な REST ベースの Web サービスを呼び出すことだけです。2日間苦労して助けが必要です。

4

4 に答える 4

1

RestKit 0.20 で GET/POST リクエスト/レスポンスを処理するには、以下のシーケンスに従うことができます:-

最初に、ベース サーバー URL を使用して RKObjectManager を構成します。

RKObjectManager *manager = [RKObjectManager managerWithBaseURL:baseUrl];
[manager.HTTPClient setDefaultHeader:@"Accept" value:RKMIMETypeJSON];
manager.requestSerializationMIMEType = @"application/json";

RestKit は常に要求と応答のオブジェクトを処理するため、応答で期待されるすべてのパラメーターを持つオブジェクトを作成する必要があります。

@interface AuthenticationRequest : NSObject
@property (nonatomic, copy) NSNumber *userName;
@property (nonatomic, copy) NSString *password;
@end

@interface AuthenticationResponse : NSObject
@property (nonatomic, copy) NSNumber *token;
@property (nonatomic, copy) NSString *expiryDate;
@property (nonatomic, copy) NSString *userId;
@end

次に、サーバーの JSON 応答のキーを使用して、ローカル オブジェクトのインスタンス変数の要求と応答のマッピングを構成します。

注: POST または PUT 要求の場合にのみ、要求マッピングを構成します。

RKObjectMapping *requestMapping = [RKObjectMapping mappingForClass:[AuthenticationRequest class]];
[requestMapping addAttributeMappingsFromDictionary:@{
                @"userName": @"userName",
                @"password" : @"password",
            }];


RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[AuthenticationResponse class]];
[responseMapping addAttributeMappingsFromDictionary:@{
                @"TOKEN": @"token",
                @"expiryDate" : @"expiryDate",
                @"USERID": @"userId"
            }];

次に、渡した pathPattern 値に基づいて、サーバー JSON オブジェクトとローカル オブジェクトのマッピングを実行する応答記述子を作成します。

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping  objectClass:[AuthenticationResponse class] rootKeyPath:nil]
[manager addRequestDescriptor:requestDescriptor];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping pathPattern:<rest of the path excluding the baseURL> keyPath:nil statusCodes:nil];
    [manager addResponseDescriptor:responseDescriptor];

次の方法でサーバー上で GET リクエストを実行します。

[manager getObjectsAtPath:(NSString *)<rest of the path excluding the baseURL>              parameters:(NSDictionary *)parameters
                 success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success
                 failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure];

または、次の方法でサーバー上で POST リクエストを実行します。

[manager postObject:AuthenticationRequest
              path:<rest of the path excluding the baseURL>
           success:(void (^)(RKObjectRequestOperation *operation, RKMappingResult *mappingResult))success
           failure:(void (^)(RKObjectRequestOperation *operation, NSError *error))failure];

成功ブロックと失敗ブロックは、応答の処理を保持します。

詳細については、RestKit の次のリンクを参照してください。

https://github.com/RestKit/RKGist/blob/master/TUTORIAL.md
于 2013-03-23T12:13:09.040 に答える
1

明らかに、これは Apple のネイティブ HTTP メソッドに対して既に回答されています。AFNetworking でどのような問題が発生したかはわかりませんが、ここの AFHTTPClient では、明らかに次のいずれかを呼び出すことができます

- (void)setAuthorizationHeaderWithUsername:(NSString *)username
                                  password:(NSString *)password;

- (void)setAuthorizationHeaderWithToken:(NSString *)token;

Web サービスによって異なります。RestKit は AFNetworking の上に構築されているため、 showのインスタンスでRKObjectManagerあるプロパティを持っているため、上記のメソッドを呼び出すこともできます (ここから)。httpClientAFHTTPClient

その後、あなたは呼び出すことができます

- (void)postPath:(NSString *)path
      parameters:(NSDictionary *)parameters
         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

ここから。

于 2013-03-22T14:16:39.193 に答える
0

NSURLConnectionDelegate で

  • (void) 接続: (NSURLConnection *) 接続 willSendRequestForAuthenticationChallenge: (NSURLAuthenticationChallenge *) チャレンジ;

メソッドがそこにあり、認証に役立ちます。

于 2013-03-22T11:18:45.167 に答える
0

資格情報 = [NSURLCredential credentialWithUser:userName パスワード:passWord 永続性:NSURLCredentialPersistenceNone];

[[チャレンジ送信者] useCredential:credential forAuthenticationChallenge:challenge];

于 2013-03-22T11:28:54.470 に答える