#ios #objective-c
#iOS #objective-c
Вопрос:
На моем сервере запущен php-код, который я называю своим веб-сервисом.Он обрабатывает данные в целочисленном значении отправки.Как я могу это получить?Вот мой URL-адрес запроса :
NSString *requestURL=[NSString stringWithFormat:@"%@?u=%@amp; p=%@amp;platform=ios",url,txtUserName.text,txtPassword.text];
Комментарий к обновлению: у меня есть php-файл на моем сервере.Он принимает 3 аргумента и регистрирует моих пользователей и возвращает значение типа 1 (для успеха, 2 для дублирования).Мне нужно отправить запрос на мой сервер как :
url="http://smwebtech.com/Pandit/web_service/signup.php?u=Testamp;p=passwordamp;platform=ios"
Как я могу отправить этот запрос на сервер и получить возвращаемое значение с сервера?
Комментарии:
1. Не могли бы вы подробнее объяснить свою проблему? Вы хотите знать, как отправить HTTP-запрос на ваш сервер?
2. Какой тип кодирования вы можете выполнить на стороне сервера json или direct xml.
Ответ №1:
Вы можете использовать NSURLConnection. Вы должны использовать реализацию NSURLConnectionDataDelegate
протокола и использовать NSURLConnection
класс.
-(void) requestPage
{
NSString *urlString = @"http://the.page.you.want.com";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageAllowed timeoutInterval:20.0f];
responseData = [[NSMutableData alloc] init];
connection = [[NSURLConnection connectionWithRequest:request delegate:self] retain];
delegate = target;
}
-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
if ([response isKindOfClass:[NSHTTPURLResponse class]])
{
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*) response;
//If you need the response, you can use it here
}
}
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[responseData appendData:data];
}
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
[responseData release];
[connection release];
}
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
if (connection == adCheckConnection)
{
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
//You've got all the data now
//Do something with your response string
[responseString release];
}
[responseData release];
[connection release];
}
Комментарии:
1. Не гарантируется, что соединение вернет все данные сразу.
responseData
собирает эту информацию до тех пор, пока соединение не завершит возврат всех данных, и в моем примере я преобразую его в строку.2. Конечное значение — это значение, возвращаемое в
connectionDidFinishLoading
и в виде строки, это значение, которое я преобразовал в строку3. да, метода didFinish не было в вашем предыдущем обновлении .. я понял это .. спасибо за ваш ответ и рекомендации proepr…
4. Я не вносил никаких изменений, иначе была бы отредактированная ссылка. Вы уверены, что не просто прокрутили вниз достаточно далеко! 😉
Ответ №2:
- посетите HttpRequest и настройте его в своем проекте в соответствии с приведенными инструкциями.
- TouchJSON — загрузите и поместите его в свой проект.
-
ниже приведены методы, которые вы можете использовать для отправки запроса и получения ответа.
-(void) SendAsyncReq:(NSString *)urlString { NSLog(@"URL IS: %@",urlString); NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; ASIHTTPRequest *request1 = [ASIHTTPRequest requestWithURL:url]; [request1 setDelegate:self]; [request1 startAsynchronous]; } /// THIS METHOD WILL BE CALLED IF REQUEST IS COMPLETED SUCCESSFULLY - (void)requestFinished:(ASIHTTPRequest *)response { NSData *responseData = [response responseData]; CJSONDeserializer *jsonDeserializer = [CJSONDeserializer deserializer]; NSDictionary *resultsDictionary = [jsonDeserializer deserializeAsDictionary:responseData error:nil]; NSLog(@"Response is: %@",resultsDictionary); } /// THIS METHOD WILL BE CALLED IF REQUEST IS FAILED DUE TO SOME REASON. - (void)requestFailed:(ASIHTTPRequest *)response { NSError *error = [response error]; NSLog(@"%d", [error code]); if([error code] !=4) { NSString *errorMessage = [error localizedDescription]; UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:errorMessage delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; [alertView release]; } }
вы должны импортировать #import «CJSONDeserializer.h» и #import «ASIHTTPRequest.h» в свой класс.
Я надеюсь, что это поможет.
Комментарии:
1. Я открыл URL-адрес, и он просто печатает HTML .. это не сработает .. вам нужно создать либо XML, либо JSON. это вы проанализируете в конце iphone. В своем ответе я предоставил код для получения ответа и анализа json.
Ответ №3:
Если вы ищете способ отправлять HTTP-запросы на сервер, существует ряд фреймворков, которые помогут вам в этом. До недавнего времени я предпочитал ASIHTTPRequest, но, к сожалению, он был прекращен.
Клиентская библиотека API Google также является хорошим вариантом, как и ряд других, предложенных создателем ASIHTTPRequest.
Там должно быть много документов, которые помогут вам начать.
РЕДАКТИРОВАТЬ: чтобы выполнить ваш конкретный запрос ASIHTTPRequest
, выполните следующие действия в классе с протоколом ASIHTTPRequestDelegate
:
/**
* Make a request to the server.
*/
- (void) makeRequest {
// compile your URL string and make the request
NSString *requestURL = [NSString stringWithFormat:@"%@?u=%@amp; p=%@amp;platform=ios", url, txtUserName.text, txtPassword.text];
NSURL *url = [NSURL URLWithString:requestURL];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}
/**
* Handle the response from the previous request.
* @see ASIHTTPRequestDelegate
*/
- (void) requestFinished:(ASIHTTPRequest*)request {
NSString *responseString = [request responseString];
// do whatever you need with the response, i.e.
// convert it to a JSON object using the json-framework (https://github.com/stig/json-framework/)
}