I am trying to make a remote server call using this code:
- (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
}
}];
}
if i don’t encode the URL, it actually comes back without an error. But if I encode the url, it gives this error:
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"}
What does this error mean? Did I encode it incorrectly? Also, when I don’t encode it, the data and response objects come back with values, but I wasn’t sure how to get those values from those objects. How do I tell what data is in those objectS?
Thanks!
The problem is that you’re encoding the entire string, which includes the scheme and the URI elements. You probably just want to encode the query part of your URL.
For example, if your URL were
http://www.example.com/whatever?u=jason&p=pass.!!, you’d want to encode the query part but nothing else. The properly encoded URL for this example would look like:http://www.example.com/whatever?u=jason&p=pass%2E%21%21Since you’re just encoding the entire string, you’re ending up with this:
http%3A%2F%2Fwww%2Eexample%2Ecom%2Fwhatever%3Fu%3Djason%26p%3Dpass%2E%21%21which is not a valid URL. Instead of escaping the entire string, just escape your query part. If your backend server can deal with it, you can build and escape the entire query string because only your server is going to parse that part. If it can’t deal with it for any reason, you’ll have to escape just the key and value parts of the query string.