Неверный URL на iPhone, когда я набираю его в браузере, он работает

Я делаю jsonstring. Когда я выполняю это, это работает, когда я делаю это в своем браузере. Я делаю это, регистрируя точный URL и копируя его в браузер. Затем я получаю HTTP Get, который я хочу, но в iPhone я получаю только Bad Login.

- (IBAction)getDown:(id)sender { //perform get request
    NSLog(@"beginnen met versturen");

    //NSString * _barCode = [[NSUserDefaults standardUserDefaults] objectForKey:@"phoneNumber"];

    //build up the request that is to be sent to the server
    //NSString*jsonString = [[NSString alloc] initWithFormat:@"{\"barcode\":\"%@\"}", _barCode];


    NSString*jsonString = [[NSString alloc] initWithFormat:@"{\"barcode\":\"123456\"}"];

    NSString *str = [NSString stringWithFormat: @"http://server.nl/scan.php?data=%@",jsonString];
    NSLog(@"%@", str);
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL    URLWithString:str]];
    NSLog(@"url: %@", request);

    [request setHTTPMethod:@"GET"];
   // [request addValue:@"getValues" forHTTPHeaderField:@"METHOD"]; //selects what task the server will perform
    NSLog(@"met value: %@", request);

    //initialize an NSURLConnection  with the request
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if(!connection){
        NSLog(@"Connection Failed");
    }

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ // executed when the connection receives data

    receivedData = data;
    /* NOTE: if you are working with large data , it may be better to set recievedData as NSMutableData
     and use  [receivedData append:Data] here, in this event you should also set recievedData to nil
     when you are done working with it or any new data received could end up just appending to the
     last message received*/
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ //executed when the connection fails

    NSLog(@"Connection failed with error: %@",error.localizedDescription);
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{

    /*This message is sent when there is an authentication challenge ,our server does not have this requirement so we do not need to handle that here*/
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{

    NSLog(@"Request Complete,recieved %d bytes of data",receivedData.length);

    //[self.delegate requestReturnedData:receivedData];//send the data to the delegate
    NSData *data = receivedData;
    NSDictionary *dictionary = [NSDictionary dictionaryWithJSONData:data];
    NSLog(@"%@",dictionary.JSONString ); ; // set the textview to the raw string value of the data recieved

    NSString *value1 = [dictionary objectForKey:@"barcode"];
    NSLog(@"%@", value1);
    NSString *value2 = [dictionary objectForKey:@"product"];
    NSLog(@"%@",dictionary);
    NSLog(@"%@", value2);

}

Вот журнал:

2013-01-10 16:31:46.550 Scanner[14875:907] http://server.nl/scan.php?data={"barcode":"123456"}
2013-01-10 16:31:46.551 Scanner[14875:907] url: <NSMutableURLRequest (null)>
2013-01-10 16:31:46.553 Scanner[14875:907] met value: <NSMutableURLRequest (null)>
**2013-01-10 16:31:46.556 Scanner[14875:907] Connection failed with error: bad URL**

Когда я удаляю полный JSON из строки, я не получаю плохой URL. Так что может быть проблема. Кто-нибудь знает, что я делаю не так?

2 ответа

Вам нужно закодировать его перед выполнением запроса URL. Лучшим и наиболее элегантным решением было бы добавить категорию, например, через NSString, что-то вроде этого:

- (NSString*)URLEncode {
    // Should not be encoded:-_.
    return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR(";/?:@&=+$,!*'()<>#%\"{}|\\^[]`~"), kCFStringEncodingUTF8) autorelease];
//
}

И когда вы делаете запрос:

NSString *str = [NSString stringWithFormat: @"http://server.nl/scan.php?data=%@",jsonString];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL    URLWithString:[str URLEncode]];

Если вы не хотите использовать дополнительные файлы (даже подумав, что это будет рекомендовано), добавьте этот метод в ваш класс:

- (NSString*)URLEncode:(NSString )yourURL {
 // Should not be encoded:-_. 
return [(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR(";/?:@&=+$,!'()<>#%\"{}|\\^[]`~"), kCFStringEncodingUTF8) autorelease]; 
} 

и использовать

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[self URLEncode:str]]; 

У меня сейчас мало информации, прошу прощения, я немного тороплюсь и только что увидел ваш вопрос. Но я видел ваш вопрос, и я помню, как работал над проектом, который по сути представлял собой пульт дистанционного управления на базе HTML для iphone, и когда пользователь нажимал на некоторые кнопки для пульта, он следовал URL-адресам, которые открывали идентичные страницы, но имели код на стороне сервера, чтобы дать команду серверу приостановить, воспроизвести, остановить и т. д. Я действительно помню, что в iPhone была ошибка, из-за которой он не мог анализировать все мои URL, даже если они были правильно отформатированы и работали на настольном клиенте. Вот почему я переключился на POST-запросы (где пользователь щелкает вместо этого активированные функции javascript, которые устанавливают скрытые переменные формы, а затем отправляют формы вместо прямой навигации по длинным URL-адресам). В любом случае, я знаю, что это может не относиться к вам напрямую, но дело в том, что я обнаружил ошибку в разборе URL-адреса iPhone, поэтому это может быть не ваша ошибка. Я посмотрю любую новую информацию, которую смогу найти чуть позже. Удачи.

Другие вопросы по тегам