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 回答