Не удается получить ответ от url

#ios #objective-c #httpresponse

#iOS #objective-c #httpresponse

Вопрос:

После обращения к некоторым вопросам в Stack Overflow я использовал приведенный ниже метод для получения ответа и кода ответа.

     NSMutableURLRequest *NSRequest;
    NSRequest = [[NSMutableURLRequest alloc] init];
    [NSRequest setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://%@:%@/auth",[[NSUserDefaults standardUserDefaults] stringForKey:@"mongoScheme"],[[NSUserDefaults standardUserDefaults] stringForKey:@"mongoHost"],[[NSUserDefaults standardUserDefaults] stringForKey:@"mongoPort"]]]];
    [NSRequest setHTTPMethod:@"GET"];
    [NSRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [NSRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];


    NSHTTPURLResponse *response = nil;
    NSData *returnData = [NSURLConnection sendSynchronousRequest:NSRequest returningResponse:amp;response error:nil];

    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
    int code = [httpResponse statusCode];
    NSLog(@"%i",code);
    NSLog(@"%@",response);
 

Но я не могу получить ни одного из них.

Я проверяю журналы и обнаружил response , что as null и statusCode as 0

как я могу это получить?

Комментарии:

1. Отсутствует код состояния HTTP 0. То, что вы видите, — это 0, возвращаемый используемым вами API.

2. Попробуйте мой репозиторий gist.github.com/jitendrabenzatine /… использование Afnetworking

3. Я думаю, вам следует попробовать NSURLSession вместо подключения

4. Я бы рекомендовал использовать асинхронный запрос вместо запроса синхронизации.

5. Я передам тот факт, что вы используете синхронный запрос, но ясно, что если он равен 0, это потому response , что есть nil . Теперь, как насчет использования этого известного error параметра sendSynchronousRequest: returningResponse:error: , который может вам ЯВНО помочь, и это ПЕРВОЕ, ЧТО НУЖНО СДЕЛАТЬ, когда он работает не так, как ожидалось.

Ответ №1:

Предупреждение: ‘sendSynchronousRequest (_:returningResponse:)’ устарел в iOS 9.0, поэтому, пожалуйста, используйте это:

Для Objective-C

 NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:"Your_URL"]
          completionHandler:^(NSData *data,
                              NSURLResponse *response,
                              NSError *error) {
            // handle response

  }] resume];
 

Для Swift,

 var request = NSMutableURLRequest(URL: NSURL(string: "YOUR URL"))
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"

var params = ["username":"username", "password":"password"] as Dictionary<String, String>

var err: NSError?
request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: amp;err)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
    println("Response: (response)")})

task.resume()
 

Ответ №2:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSString *string = BaseURLString1;
NSString* encodedUrl = [string stringByAddingPercentEscapesUsingEncoding:
                            NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:encodedUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:encodedUrl parameters:nil error:nil];
NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
          NSLog(@"Error: %@", error);
     } else {
           NSArray *dictValue=[[NSArray alloc] init];
           dictValue=[responseObject valueForKey:@"KEY"];
    }];
    [dataTask resume];
 

Ответ №3:

Варианты выполнения HTTP-запросов в Objective-C могут быть немного пугающими. Одно из решений, которое хорошо сработало для меня, — использовать NSMutableURLRequest

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"GET"];
[request setURL:[NSURL URLWithString:url]];

NSError *error = [[NSError alloc] init];
NSHTTPURLResponse *responseCode = nil;

NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:amp;responseCode error:amp;error];

if([responseCode statusCode] != 200){
    NSLog(@"Error getting %@, HTTP status code %i", url, [responseCode statusCode]);
    return nil;
}

return [[NSString alloc] initWithData:oResponseData encoding:NSUTF8StringEncoding];