Неверный URL-адрес AFNetworking

У меня здесь странная проблема, и я удивлен, что не нашел никого с такой же проблемой.

Я использую AFNetworking для создания AFJSONRequestOperation.

Он работает при первом подключении к сети. Однако тот же код дает сбой после установления сетевого подключения и отображает ошибку «Неверный URL».

Странно то, что приложение даже не пингует сервер перед сбоем, я использую Чарльза для прослушивания всех запросов.

Кто-нибудь еще испытал это?

Для справки, вот код:

  NSURL *url = [NSURL URLWithString:JOIN_URL];
     AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

   // httpClient.parameterEncoding = AFJSONParameterEncoding;
     NSString *path = [NSString stringWithFormat:@"%@?%@",JOIN_URL, getString];

     NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET" path:path parameters:nil];


    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request

                                                                                      success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

                                                                                          NSLog(@"SUCCESS JSON: %@", JSON);

                NSLog(@"RESPONSE URL: %@",response.URL);
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"FAIL JSON: %@", JSON);
        NSLog(@"FAIL ERROR: %@", error.description);
        NSLog(@"RESPONSE URL: %@",response.URL);

        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Connection Error" message:@"Cannot connect now, please try again" delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles: nil];
        [alert show];

    }];


    [operation start];

person Buyin Brian    schedule 06.11.2012    source источник


Ответы (3)


Насколько я понимаю AFHTTPClient, вы предоставляете ему baseURL, который является базовым URL-адресом, к которому будет добавлен весь указанный вами путь. Затем, когда вы указываете путь, вы предоставляете только относительную часть этого пути.

Итак, если у вас есть веб-служба по адресу http://www.example.com/webservice/, которая имеет некоторые таких методов, как /listAll?n=10, вы будете предоставлять только "listAll" для аргумента path аргумента requestWithMethod:path:parameters: и словарь @{ @"n" : @10 } для аргумента parameters.

Вы уже предоставили свой JOIN_URL при создании экземпляра AFHTTPClient, поэтому, если вы снова передадите этот JOIN_URL в пути, он дважды появится в URL-адресе, созданном AFHTTPClient внутренне!

person AliSoftware    schedule 06.11.2012
comment
Ах, хороший улов, это определенно вызовет проблему. его URL-адрес будет таким: server.com/server.com?getparameters Я бы все равно избегал вашей строки пути, чтобы убедиться, что в параметрах get нет пробелов. - person mkral; 06.11.2012
comment
Нет, вам не нужно экранировать параметры, так как вы не должны передавать их после ? в пути, а скорее как NSDictionary к аргументу parameters. AFHTTPClient закодирует параметры в этом словаре для вас с правильной кодировкой и процентными переходами по мере необходимости и составит конечный URL-адрес, используя словарь baseURL, path и parameters. На самом деле это один большой интерес AFHTTPClient, все эти трюки решаются здесь для вас. - person AliSoftware; 06.11.2012

Вы действительно должны кодировать строку URL path следующим образом:

NSString* escapedUrlString =[path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
person mkral    schedule 06.11.2012
comment
Это была одна из первых вещей, которые я попробовал. Но оказалось, что было 2 проблемы. Одной из проблем была ошибка кэширования на стороне сервера. Как только это было решено, это фактически устранило проблему. Спасибо - person Buyin Brian; 07.11.2012
comment
Хотя это могло решить вашу проблему, я НАСТОЯТЕЛЬНО призываю вас считать ответ @AliSoftware правильным. Это способ использования AFNetwork. Он прав в том, что нет причины экранировать символы, если вы добавите их в качестве параметров GET через NSDictionary в запрос. - person mkral; 07.11.2012

Цель-С:

[query stringByAddingPercentEncodingWithAllowedCharacters:
        [NSCharacterSet URLQueryAllowedCharacterSet]];

Быстрый:

query.stringByAddingPercentEncodingWithAllowedCharacters(
       NSCharacterSet.URLQueryAllowedCharacterSet())
person Xavi Gil    schedule 06.11.2015