2012-04-30 8 views
1

私は奇妙な問題があります。だから私はユーザーがログインできる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に対してはうまくいくのだろうが、自分のサーバーに配備されたときには動作しないという人生の理由を理解することはできません。

ありがとうございます!

+2

接続をパケットで盗聴するか、Fiddlerのようなプロキシ経由で携帯電話を実行して、何が起こっているかを確認してください。 – Brad

+1

あなたのコードを正しく読んでいる場合は、(https)暗号化なしでユーザー名とパスワードをGETパラメータとして送信しています。これは、接続を盗聴する人があなたのユーザーの資格情報を盗むことができることを意味します。 – TheRealKingK

+0

素晴らしいBrad!なぜ私はそれを考えなかったのですか?私はあなたが言ったとおりに正確に行ったが、代わりにチャールズを使用した。私は問題を発見した。私は答えを投稿します。もう一度bradに感謝します。 @TheRealKingK良い目。私は今試作段階に入っています。私はすぐにSSL証明書を取得しようとしています。 – Khon

答えて

0

@Bradの提案のおかげで、私の問題の原因がわかりました。

リクエストをチャールズで調べると、リクエストが「http://mywebsite.com」であることが判明しました。その後、パスは/ user/authでした。 "/ api"の部分が欠落していました。

多分これが標準ですが、私は知りませんが、AFHTTPClientの(私のTKRHttpClientがAFHTTPClientを拡張)initWithBaseURLが本当にホストURLを意味していることが表示されます。 "/ api"の部分が折り返されます。私はルートとしてローカルアプリを展開し、そうない「/ API」

はので、2つの方法この問題を解決するためにはありませんでしたので、

は、それがローカルに動作していた理由があります。 1. rootとしてアプリケーションに再デプロイします。または2.変更からコードの行:

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

TO:

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

がうまくいけば、これは将来的にAFNetworkingを使用して誰にも役立ちます。

+0

これは 'AFHTTPClient'に書かれています。 'baseURL'にパスが含まれている場合、クライアントに渡された絶対パスパラメータは初期パスを上書きします。ですから、あなたの場合は '@"/user/auth "'を '@" user/auth "'に置き換えるだけでそのトリックを行います。 – mattt

関連する問題