0

このコードを使用してリモートサーバー呼び出しを行おうとしています。

- (IBAction)login:(id)sender 
{    
    // Arguments are subject and body.
    NSString *urlString = @"my_url";

    NSString *email = self.email.text;
    NSString *password = self.password.text;


    NSString *url_to_send = [NSString stringWithFormat:urlString , email , password];;     

    NSString *escapedString = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                                  (__bridge CFStringRef)url_to_send,
                                                                                  NULL,
                                                                                  (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                  kCFStringEncodingUTF8);

    // Now send to the server    
    NSURL *url = [NSURL URLWithString:escapedString];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    // ***************
    // TODO: ok I dont really understand what this is
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // **************

    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {                  
         NSLog(@"This is data: %@" , data);
         NSLog(@"This is response: %@" , response);
         NSLog(@"This is error: %@" , error);

         if ( error == nil )
         {
             // Display a message to the screen.
         }
         else
         if ([data length] > 0 && error == nil)
         {
                 // Do something
         }
         else 
         {
             // Do something else                         
         }
     }];    
}

URLをエンコードしないと、実際にはエラーなしで返されます。しかし、URLをエンコードすると、次のエラーが発生します。

This is data: (null)
2012-07-08 11:10:56.110 BusinessPlan[1630:14603] This is response: (null)
2012-07-08 11:10:56.111 BusinessPlan[1630:14603] This is error: Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo=0x684a180 {NSErrorFailingURLStringKey=My_encoded_url, NSErrorFailingURLKey=my_encoded_url, NSLocalizedDescription=unsupported URL, NSUnderlyingError=0x6895d00 "unsupported URL"}

このエラーはどういう意味ですか?間違ってエンコードしましたか?また、エンコードしないと、データオブジェクトと応答オブジェクトに値が返されますが、それらのオブジェクトからこれらの値を取得する方法がわかりませんでした。それらのオブジェクトにどのデータがあるかをどのように見分けることができますか?

ありがとう!

4

1 に答える 1

5

問題は、スキームとURI要素を含む文字列全体をエンコードしていることです。おそらく、URLのクエリ部分をエンコードしたいだけです。

たとえば、URLがhttp://www.example.com/whatever?u=jason&p=pass.!!の場合、クエリ部分をエンコードしますが、それ以外はエンコードしません。この例の適切にエンコードされたURLは次のようになります。

http://www.example.com/whatever?u=jason&p=pass%2E%21%21

文字列全体をエンコードしているだけなので、次のようになります。

http%3A%2F%2Fwww%2Eexample%2Ecom%2Fwhatever%3Fu%3Djason%26p%3Dpass%2E%21%21

これは有効なURLではありません。文字列全体をエスケープする代わりに、クエリ部分をエスケープするだけです。バックエンドサーバーがそれを処理できる場合は、サーバーのみがその部分を解析するため、クエリ文字列全体を構築してエスケープできます。なんらかの理由で処理できない場合は、クエリ文字列のキーと値の部分だけをエスケープする必要があります。

于 2012-07-08T15:52:58.650 に答える