私は奇妙な問題があります。だから私はユーザーがログインできるiphoneアプリに取り組んでいます。ログインすると、アプリケーションはサーバーにhttp GETリクエストを行うことでユーザーを認証します。ユーザー名とパスワードが正しい場合は、認証トークン(典型的なもの)を返します。私のiPhoneアプリが私のサーバーに接続できないのはなぜですか?
奇妙な部分は、ローカルでテストして、ローカルマシンに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];
iがブレークポイントに入れ、そして要求がストレート故障ブロックに行くようです。 "NSLog(@コードは%i"、response.statusCode); "失敗ブロックでは200が出力されますが、サーバー上のログには要求がありませんでした。
ご協力いただければ幸いです。なぜ私のローカルtomcatに対してはうまくいくのだろうが、自分のサーバーに配備されたときには動作しないという人生の理由を理解することはできません。
ありがとうございます!
接続をパケットで盗聴するか、Fiddlerのようなプロキシ経由で携帯電話を実行して、何が起こっているかを確認してください。 – Brad
あなたのコードを正しく読んでいる場合は、(https)暗号化なしでユーザー名とパスワードをGETパラメータとして送信しています。これは、接続を盗聴する人があなたのユーザーの資格情報を盗むことができることを意味します。 – TheRealKingK
素晴らしいBrad!なぜ私はそれを考えなかったのですか?私はあなたが言ったとおりに正確に行ったが、代わりにチャールズを使用した。私は問題を発見した。私は答えを投稿します。もう一度bradに感謝します。 @TheRealKingK良い目。私は今試作段階に入っています。私はすぐにSSL証明書を取得しようとしています。 – Khon