1

私は奇妙な問題を抱えています。そのため、ユーザーがログインできるiphoneアプリで作業しており、ログインすると、アプリはサーバーにhttpGETリクエストを送信してユーザーを承認します。ユーザー名とパスワードが正しい場合は、認証トークン(通常のもの)を返します。

奇妙な部分は、これをローカルでテストし、httpリクエストのURLをローカルマシンに向けると、正常に機能することです。すべてが正しく承認され、すべてのデータが正しく返されます。

しかし、今日、私はアプリを十分に安定させたので、残りのAPIをサーバーにデプロイすることにしましたが、httpリクエストのURLをサーバーのURLに変更すると、リクエストは失敗します。

サーバーが正しくデプロイされていない可能性があると思ったので、Firefox Restクライアントでhttpエンドポイントをテストしたところ、すべてが機能しているようで、認証が機能し、データが返されました。

誰か考えがありますか?私は問題が何であるかについて迷っています。

AFNetworkingライブラリを使用してリクエストを行っています。

これが私のコードです:

self.apiHttpClient = [[TKRHttpClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://mywebsite.com/api"]];

--------------

NSString *username = [usernameField text];
NSString *password = [passwordField text];
TKRHttpClient *httpClient = [TKRHttpClient sharedInstance];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"/user/auth" parameters:nil];
[request addValue:username forHTTPHeaderField:@"username"];
[request addValue:password forHTTPHeaderField:@"password"];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
    if(response.statusCode == 200){
        NSDictionary * headers = [response allHeaderFields];
        NSString *token = [headers objectForKey:@"auth_token"];
        NSLog(@"token was %@", token);
        [[AppController sharedAppController] initializeDataForUserToken:token];
    }else{
        NSLog(@"upload failed!");
    }
} failure:^(NSURLRequest *request , NSHTTPURLResponse *response , NSError *error , id JSON ) {
    NSLog(@"code was: %i", response.statusCode);
    if(response.statusCode == 401){
        [errorMessage setText:@"Incorrect password or username"];
    }
}];
[operation start];

ブレークポイントを設定しましたが、リクエストは直接失敗ブロックに送られるようです。「NSLog(@ "code was:%i"、response.statusCode);」という行 失敗ブロックで200が出力されます。しかし、サーバーでログを追跡すると、要求が受信されませんでした。

どんな助けでも大歓迎です。ローカルのTomcatに対して機能する理由を一生理解できませんが、サーバーにデプロイすると機能しません。

前もって感謝します!

4

1 に答える 1

0

@Bradの提案のおかげで、問題の理由を見つけました。

チャールズでリクエストを調べたところ、リクエストは「http://mywebsite.com」として行われたことがわかりました。パスの場合は/ user/authでした。そのため、「/api」の部分がありませんでした。

これが標準かもしれませんが、私にはわかりませんが、AFHTTPClient(私のTKRHttpClientはAFHTTPClientを拡張します)のinitWithBaseURLは実際にはホストURLを意味しているようです。「/api」の部分が削除されます。

ローカルで機能していた理由は、アプリをrootとしてローカルにデプロイしたため、「/api」がなかったためです。

これを修正する2つの方法。1.ルートとしてサーバーにアプリとして再デプロイします。または2.コード行を次のように変更します。

NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"/user/auth" parameters:nil];

に:

NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"api/user/auth" parameters:nil];

うまくいけば、これは将来AFNetworkingを使用する人に役立つでしょう。

于 2012-04-30T13:56:16.130 に答える