Отправка запроса и получение ответа

#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:

  1. посетите HttpRequest и настройте его в своем проекте в соответствии с приведенными инструкциями.
  2. TouchJSON — загрузите и поместите его в свой проект.
  3. ниже приведены методы, которые вы можете использовать для отправки запроса и получения ответа.

       -(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/) 
}