2014-12-03 2 views
0

Im новый для использования AFNetworking. Мне удалось сделать запрос GET с некоторой помощью от хорошего парня в переполнении стека.AFNetworking отправка NSMutableDictionary как POST

Теперь я застрял в создании запроса POST. Я пробую этот код, но я всегда оказываюсь в неудавшемся блоке. Как так?

-(void) postEventInfo: (NSMutableDictionary *) eventInfoObject{ 

NSURL *url = [NSURL URLWithString:string]; 

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
manager.responseSerializer = [AFJSONResponseSerializer serializer]; 

[manager POST:string parameters:eventInfoObject success:^(NSURLSessionDataTask *task, id responseObject) { 

    NSLog(@"JSON: %@", responseObject); 
    //here is place for code executed in success case 

} failure:^(NSURLSessionDataTask *task, NSError *error) { 


    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error while sending POST" 
                 message:@"Sorry, try again." 
                 delegate:nil 
               cancelButtonTitle:@"Ok" 
               otherButtonTitles:nil]; 
    [alertView show]; 

    NSLog(@"Error: %@", [error localizedDescription]); 
}]; 
} 

я получаю следующее сообщение об ошибке:

Error: Request failed: internal server error (500)

Thnx ..

EDIT1

ИТАК после тестирования немного больше я заметил, что связь на самом деле идет сквозной и inte делает то, что я хочу сделать, но он все еще показывает мне сообщение об ошибке, означающее, что все еще идет к отказу.

Я ДУМАЮ, что мой сервер отправляет обратно текст/html, может ли это быть чем-то связано с этим?

часть были NSURLConnection работали

edit2

NSError *error; 
NSData *event = [NSJSONSerialization dataWithJSONObject:eventInfoObject 
               options:NSJSONWritingPrettyPrinted 
                error:&error]; 

if (! event) { 
    NSLog(@"Got an error: %@", error); 
} else { 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:event]; 
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[event length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setURL:[NSURL URLWithString:string]]; 

    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

    [conn start]; 
} 
+0

Ваш сервер разбился. – Andy

+0

Но почему. он отлично работает, когда я отправляю его с помощью Normal NSURLConnection @Andy –

+0

Вы отправляете приложение/json правильно? – Andy

ответ

1

Если ваш сервер не устанавливая Content-Type заголовок application/json (или что-то эквивалент), AFHTTPSessionManager потерпит неудачу. Вы могли бы теоретически утверждать, что значение AFNetworking acceptableContentTypes, но лучше этого, вы должны просто исправить код сервера, чтобы вернуть соответствующий заголовок Content-Type.

Но если ваш сервер отвечает кодом 500, то у вас есть еще одна фундаментальная проблема, которую мы не сможем решить без дополнительной информации о сервере (например, код, некоторые сведения о реализации и т. Д.). ,

Если у вас есть рабочий пример NSURLConnection, я был бы склонен запускать как этот код, так и вышеуказанный код и наблюдать за запросами через Charles. Посмотрите внимательно на различия в запросах, и проблема, вероятно, выскочит на вас.

+0

Спасибо за Чарльза! я буду использовать его и посмотреть его –

+0

Я думаю, что мне действительно удалось изменить, чтобы сервер отправил приложение/json вместо этого. Как я знал, потому что, перейдя по URL-адресу, я вижу, что шрифт текста изменился. Я скачал Чарльза, но я не могу заставить его отображать запросы, которые производятся с симулятора. Я видел несколько учебных пособий, в которых мне нужно вручную установить прокси-сервер и порт, но мой симулятор IOS не имеет вкладку wifi, на которую я могу нажать? Как я могу исправить это @Rob –

+0

Я запускаю его перед симулятором. Но если вы проверите свой симулятор и попробуйте найти вкладку wifi, чтобы выбрать прокси и порты. Вы не найдете его. Я не знаю, где настроить параметры, если у симулятора нет вкладки беспроводной сети @Rob –

0

Таким образом, проблема в том, что с AFNetworking установить базовый URL для менеджера HTTP, например

http://api.example.com/ 

Но тогда, когда вы размещаете запросы вы используете конечную точку (путь относительно базового URL) вместо абсолютного URL, например

[manager POST:@"users/add" ... 

Какой AFNetworking автоматически превращается в абсолютный URL за сценой:

http://api.example.com/users/add 

Это явно сделано для удобства создания клиентов API, поэтому POST, GET и другие методы принимают строковый аргумент вместо NSURL.

В вашем конкретном случае меняющегося

[manager POST:string ... 

в

[manager POST:@"/" ... 

Если эффективно решить эту проблему.

+0

Не работает :(, Метод почты все еще работает, и мои данные публикуются и обновляются, но в режиме просмотра по-прежнему отображается @Andy –

Смежные вопросы