как создать простой Http-запрос через AFNetworking

Я все еще использую ASIHTTPRequest и ищу слово для перехода на AFNetworking. Я также прошел Raywenderlich Crash Course Но он не использует AFNetworking 2.0.

Я только что попробовал приведенный ниже пример, который упоминается в AFNetworking, но он почему-то не работает.

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

NSDictionary *parameters = @{@"UserId": @"24",@"ArticleId":@"0"};

NSLog(@"%@",parameters);



[manager POST:@"http://mysite.com/api/User/showArticleList" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
    NSLog(@"JSON: %@", responseObject);


}failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
    NSLog(@"Error: %@", error);
}];

Отображается область отладки:

Error Domain=NSCocoaErrorDomain Code=3840
"Операция не может быть завершена. (Ошибка Cocoa 3840.)" (Текст JSON не начинался с массива или объекта, а параметр разрешения фрагментов не установлен.) UserInfo=0xa0ba580 { NSDebugDescription=Текст JSON не начинался с массива или объекта, а параметр разрешения фрагментов не установлен.}

Но когда я использую ссылку, упомянутый ускоренный курс Raywenderlich

 [manager POST:@"http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
 {
     NSLog(@"JSON: %@", responseObject);
 }failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     NSLog(@"Error: %@", error);
 }];

Это дает мне идеальный вывод JSON, почему это так?


person bhavya kothari    schedule 04.10.2013    source источник
comment
Вы поставили setDefaultHeader:@"Accept" value:@"application/json"   -  person Larme    schedule 04.10.2013
comment
Это AFNetworking 2.0 в приведенном выше случае. setDefaultHeader не может быть установлен.   -  person bhavya kothari    schedule 23.10.2013


Ответы (2)


Наконец-то я нашел решение следующим образом:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];


  NSDictionary *parameters = @{@"UserId": @"24",@"Name":@"Robin"};

  NSLog(@"%@",parameters);
  parameters = nil;

    // if you want to sent parameters you can use above code 

    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    [manager POST:@"http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
    {

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


   }failure:^(AFHTTPRequestOperation *operation, NSError *error)
   {
        NSLog(@"Error: %@", error);
   }];

Для text/Html +, если он не предоставляет правильную строку JSON, вы можете удалить ее из строки и преобразовать в массив или словарь.

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

        // if you want to sent parameters you can use above code
        manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
     // header("Content-Type: application/json");
    //    manager.requestSerializer = [AFJSONRequestSerializer serializer];

        manager.responseSerializer = [AFHTTPResponseSerializer serializer];


        [manager GET:@"your url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

            NSLog(@"responseObject %@",responseObject);

            NSString *jsonString =  [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

            NSString *newJsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\'" withString:@""];

/*
NSRange range = [jsonString rangeOfString:@"}" options:NSBackwardsSearch];
jsonString = [jsonString substringToIndex:range.location + 1];
*/
            NSData *data = [newJsonString dataUsingEncoding:NSUTF8StringEncoding];

            NSError *error;
            NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

            NSLog(@"array %@",array);


            if (!array) {
                NSLog(@"Parsing JSON failed: %@", error);
            }

            /*
             NSData *newJSONData = [newJsonString dataUsingEncoding:NSUTF8StringEncoding];
             NSDictionary* json = [NSJSONSerialization
             JSONObjectWithData:newJSONData
             options:NSJSONReadingMutableContainers
             error:&error];
             NSLog(@"json %@",json);
            */

            NSLog(@"responseObject = %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);


        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

            NSLog(@"%@",[error description]);

        }];

В некоторых случаях вам нужно изменить словарь/массив ответа, но иногда все фрагменты объекта не изменяемы.
Для этого сделайте следующее.

Для словаря

 NSError *error;

                NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:responce options:NSJSONWritingPrettyPrinted error:&error];

                responseDictionary = [[NSMutableDictionary alloc]init];

                responseDictionary = [NSJSONSerialization JSONObjectWithData:dataFromDict options:NSJSONReadingMutableContainers error:&error];

Для массива

NSError *error;

                NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:responce options:NSJSONWritingPrettyPrinted error:&error];

                responseArray = [[NSMutableDictionary alloc]init];

                responseArray = [NSJSONSerialization JSONObjectWithData:dataFromDict options:NSJSONReadingMutableContainers error:&error];
person bhavya kothari    schedule 26.12.2013

Кажется, у вас есть служба веб-API ASP.NET на стороне сервера. Он возвращает XML по умолчанию.

У вас есть два варианта:

  1. Вместо этого измените конфигурацию веб-службы, как описано в Как заставить веб-API ASP.NET возвращать JSON вместо XML с помощью Chrome?

  2. Отправьте заголовок HTTP Accept: application/json вместе с вашим запросом.

person Codo    schedule 04.10.2013
comment
Я не использую веб-API ASP.NET, и, во-вторых, нет параметров подсказки кода для заголовка HTTP. - person bhavya kothari; 23.10.2013
comment
Итак, что вы используете на стороне сервера? И какой формат он возвращает, если вы не укажете его с помощью HTTP-заголовка Accept? - person Codo; 23.10.2013
comment
веб-сервис сделан через PHP-MYSQL и предоставляет данные в формате JSON - person bhavya kothari; 01.11.2013