Соединение NSURLConnection с сервером, но не размещение данных

Всякий раз, когда я пытаюсь отправить что-то на свой PHP-сервер, я получаю следующее сообщение. Кажется, что код подключается к серверу, но данные не возвращаются, и данные сообщения не проходят. Он работал через приложение Java, которое я сделал, поэтому я могу заверить, что они не имеют ничего плохого в моем PHP. Если бы вы могли мне помочь, или мне нужен еще какой-нибудь код, чтобы помочь мне, просто попросите об этом. Благодарю.

Вот код, который подготавливает мои переменные для NSURLConnection:

NSString *phash = [NSString stringWithFormat:@"%d",phashnum]; [phash stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; name = _nameField.text; [name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; email = _emailField.text; [email stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

Вот код для моего NSURLConnection:

 NSString *urlPath = [NSString stringWithFormat:@"http://54.221.224.251"]; NSURL *url = [NSURL URLWithString:urlPath]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; NSString *stringdata = [NSString stringWithFormat:@"name=%@&email=%@&phash=%@",name,email,phash]; NSOperationQueue *queue= [[NSOperationQueue alloc]init]; NSString *postData = [[NSString alloc] initWithString:stringdata]; [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[postData dataUsingEncoding:NSUTF8StringEncoding]]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if ([data length] > 0 && connectionError==nil){ NSLog(@"Connection Success. Data Returned"); NSLog(@"Data = %@",data); NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; int code = [httpResponse statusCode]; NSString *coder = [NSString stringWithFormat:@"%d",code]; NSLog(@"%@",coder); } else if([data length] == 0 && connectionError == nil){ NSLog(@"Connection Success. No Data returned."); NSLog(@"Connection Success. Data Returned"); NSLog(@"Data = %@",data); NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; int code = [httpResponse statusCode]; NSString *coder = [NSString stringWithFormat:@"%d",code]; NSLog(@"%@",coder); } else if(connectionError != nil && connectionError.code == NSURLErrorTimedOut){ NSLog(@"Connection Failed. Timed Out"); NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; int code = [httpResponse statusCode]; NSString *coder = [NSString stringWithFormat:@"%d",code]; NSLog(@"%@",coder); } else if(connectionError != nil) { NSLog(@"%@",connectionError); NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; int code = [httpResponse statusCode]; NSString *coder = [NSString stringWithFormat:@"%d",code]; NSLog(@"%@",coder); } }]; 

Заранее спасибо.

Related of "Соединение NSURLConnection с сервером, но не размещение данных"

Как сказал @elk, вы должны заменить пробелы на + . Но вы должны иметь процентные коды с зарезервированными символами (как определено в RFC2396 ).

К сожалению, стандартный stringByAddingPercentEscapesUsingEncoding не будет stringByAddingPercentEscapesUsingEncoding от всех зарезервированных символов. Например, если имя было «Bill & Melinda Gates» или «Bill + Melinda Gates», stringByAddingPercentEscapesUsingEncoding не будет stringByAddingPercentEscapesUsingEncoding % или + (и, следовательно, + будет интерпретироваться как пробел, а & было бы интерпретируется как разделитель следующего параметра POST ).

Вместо этого используйте CFURLCreateStringByAddingPercentEscapes , поставляя необходимые зарезервированные символы в параметре legalURLCharactersToBeEscaped а затем заменяйте пробелы на + . Например, вы можете определить категорию NSString :

 @implementation NSString (PercentEscape) - (NSString *)stringForPostParameterValue:(NSStringEncoding)encoding { NSString *string = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, (CFStringRef)@" ", (CFStringRef)@";/?:@&=+$,", CFStringConvertNSStringEncodingToEncoding(encoding))); return [string stringByReplacingOccurrencesOfString:@" " withString:@"+"]; } @end 

Обратите внимание: в основном я был связан с символами & и + , но RFC2396 (который заменяет RFC1738) перечисляет эти дополнительные символы как зарезервированные, поэтому, вероятно, разумно включить все эти зарезервированные символы в legalURLCharactersToBeEscaped .

Стянув это вместе, у меня может быть код, который отправляет запрос как:

 NSDictionary *params = @{@"name" : _nameField.text ?: @"", @"email": _emailField.text ?: @"", @"phash": [NSString stringWithFormat:@"%d",phashnum]}; NSURL *url = [NSURL URLWithString:kBaseURLString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[self httpBodyForParamsDictionary:params]]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if (error) NSLog(@"sendAsynchronousRequest error = %@", error); if (data) { // do whatever you want with the data } }]; 

Использование утилиты:

 - (NSData *)httpBodyForParamsDictionary:(NSDictionary *)paramDictionary { NSMutableArray *paramArray = [NSMutableArray array]; [paramDictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) { NSString *param = [NSString stringWithFormat:@"%@=%@", key, [obj stringForPostParameterValue:NSUTF8StringEncoding]]; [paramArray addObject:param]; }]; NSString *string = [paramArray componentsJoinedByString:@"&"]; return [string dataUsingEncoding:NSUTF8StringEncoding]; } 

"name =% @ & email =% @ & phash =% @" не является правильной строкой, кодируемой по URL. Каждая пара ключей и значений должна быть разделена символом «&», а каждый ключ – значением «=». Ключи и значения обе экранируются путем замены пробелов символом «+», а затем закодированы с помощью stringByAddingPercentEscapesUsingEncoding .

См. Приложение / x-www-form-urlencoded .

Вы можете найти рецепт, как это сделать в этом сообщении в блоге .