0

PHP スタック上にある REST API で認証を機能させるのに問題があります。ブラウザでログインできるようにするクエリ文字列は、次のようになりますhttp://foo.com/gamer/index.php?module=Login&action=myLogin ... RestKit で利用可能なすべてのドキュメントに従い、次のコードを思いつきました、NSLogConfigure を有効にすることに加えて、その出力はコードに従います。コード

- (void)sendHTTPAuthRequestWithParams {
NSMutableDictionary* authParams = [[NSMutableDictionary alloc] init];
NSMutableDictionary* moreParams = [[NSMutableDictionary alloc] init];

//user and password params
[authParams setObject:usernameTextField.text forKey:@"login"];
[authParams setObject:passwordTextField.text forKey:@"password"];

//more parameters for rest login api
[moreParams setObject:@"Login" forKey:@"module"];
[moreParams setObject:@"mylogin" forKey:@"action"];
[moreParams setObject:authParams forKey:@"params"];

//parsing
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON];
NSError *error = nil;
NSString *json = [parser stringFromObject:moreParams error:&error];

[RKClient sharedClient].authenticationType = RKRequestAuthenticationTypeHTTP;

//if no error
if(!error) {        
    RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
    [[RKClient sharedClient] post:@"/index.php?" params:[RKRequestSerialization serializationWithData:[json dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON] delegate:self];  
    RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);
}    
//[[RKClient sharedClient] post:@"/index.php?module=Login&action=mylogin" params:authParams delegate:self];   }

RKLogConfigureByName() 出力

    2012-05-24 19:59:09.513 GiantsGamer[57045:207] D restkit.network:RKRequest.m:435 Sending asynchronous POST request to URL http://www.foo.com/gamer/index.php. 
2012-05-24 19:59:09.514 GiantsGamer[57045:207] T restkit.network:RKRequest.m:381 Prepared POST URLRequest '<NSMutableURLRequest http://localhost/gamer/index.php>'. HTTP Headers: {
"Content-Length" = 85; "Content-Type" = "application/json";}. HTTP Body: {"module":"Login","action":"mylogin","params":{"login":"admin","password":"admin"}}. 2012-05-24 19:59:09.736 GiantsGamer[57045:207] D restkit.network:RKResponse.m:195 NSHTTPURLResponse Status Code: 200 2012-05-24 19:59:09.737 GiantsGamer[57045:207] D restkit.network:RKResponse.m:196 Headers: {"Cache-Control" = "no-store, must-revalidate";
    Connection = "Keep-Alive";
    "Content-Length" = 2745;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Fri, 25 May 2012 02:59:09 GMT";
    Expires = "";
    "Keep-Alive" = "timeout=5, max=100";
    Pragma = "";
    Server = "Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r DAV/2 PHP/5.3.8";
    "Set-Cookie" = "PIWIK_SESSID=a065dba239819175689b1e2a23021d01; path=/; HttpOnly";
    "X-Frame-Options" = sameorigin;
    "X-Powered-By" = "PHP/5.3.8";
}
2012-05-24 19:59:09.737 GiantsGamer[57045:207] T restkit.network:RKResponse.m:203 Read response body: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>…
</head>
<body>...
</body>
</html>

ログからわかるように、クエリ文字列 (認証パラメーター) は HTTP ボディに含まれています。それでいいですか?また、http 応答ステータス コード 200 (OK) を取得しますが、index.html の Web ページによって生成された HTML コード全体が表示されます。どこが間違っているのかわかりませんか?RestKit 応答を解読するにはどうすればよいですか?

4

1 に答える 1

1

モジュールとアクションを GET ではなく POST 値として送信しているため、コードが機能していません。params なしで index.php にリクエストを送信した場合と同じ html コードを受け取っている可能性があります。必要に応じて、コードを試して HTML 応答全体をキャプチャし、それを Web 上の index.php HTML 応答と比較することができます。params なしで、それらは同じであるに違いありません。

このコードはまだテストしていませんが、試してみてください。

- (void)sendHTTPAuthRequestWithParams {

    NSString *loginPath = [NSString stringWithFormat:@"index.php?module=%@&action=%@",@"Login",@"myModule"];

    NSMutableDictionary* authParams = [[NSMutableDictionary alloc] init];
    [authParams setObject:usernameTextField.text forKey:@"login"];
    [authParams setObject:passwordTextField.text forKey:@"password"];

    [[RKClient sharedClient] post:loginPath usingBlock:^(RKRequest *request) {
        request.authenticationType = RKRequestAuthenticationTypeHTTP;
        request.method = RKRequestMethodPOST;
        request.params = authParams;
        request.delegate = self;
        request.onDidLoadResponse = ^(RKResponse *response){
            if (response.statusCode > 299) {
                //We got an error!
            }else {
                //Check Response Body to get Data!
            }
        };

    }];
}

応答本文で NSData を取得します。応答で json が予想される場合は、次のようにしてそれを NSDictionary に変換できます: NSData to NSDictionary from JSON

RK の主な欠点は、適切なドキュメントがないことです。ここでは、いくつかの基本を理解するために参照できるものをいくつか示します。

RestKit で RKObjectMapping を使用して、やりたいことを行うもう少し高度な別の方法を見ることができます: RKParams でAPI に投稿し、 RestKit を使用して RKObjectMapping で応答をマッピングします

最後に、このコードも確認できます。RESTKit を使用して単純な json POST を実行する方法が説明されています。

また、twitter で RestKit の開発者に質問することもできます。それは私にとって非常にうまくいきました。彼らは本当に速く答えます!.

于 2012-05-28T06:42:26.747 に答える