Подтвердить что ты не робот

AFNetworking 2.0 Domain = AFNetworkingErrorDomain Code = -1011 "Ошибка запроса: внутренняя ошибка сервера (500)

Я пытаюсь преобразовать свой код в AFNetworking 2.0 с дополнительным классом AFHTTPRequestOperationManager. Вот мой код

+ (NSAFNetwokingRequestManager *)sharedClient {
    static NSAFNetwokingRequestManager *_sharedClient = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:GET_CAR_BRAND]];
    });
    return _sharedClient;
}
- (instancetype)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];
     if (self) {
    self.responseSerializer = [AFXMLParserResponseSerializer serializer];
    self.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/soap+xml"];
    self.requestSerializer = [AFHTTPRequestSerializer serializer];
    [self.requestSerializer setValue:@"application/soap+xml" forHTTPHeaderField:@"Content-type"];
}

    return self;
}
- (void)requestBrandcompletion:(NSAFNetwokingRequestManagerCompletionBlock)completion {
    NSString *[email protected]"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
    "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
    "<soap:Body>\n"
    " <CarBrandExt xmlns=\"http://www.nohausystems.nl/\" />\n"
    "</soap:Body>\n"
    "</soap:Envelope>\n";
    NSString *msgLength = [NSString stringWithFormat:@"%i",[soapRequest length]];
    [self POST:GET_CAR_BRAND parameters:Nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
          [formData appendPartWithHeaders:[NSDictionary dictionaryWithObjectsAndKeys:@"text/xml; charset=utf-8", @"Content-Type", msgLength, @"Content-Length", nil] body:[soapRequest dataUsingEncoding:NSUTF8StringEncoding]];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (completion) {
            completion(YES, responseObject);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (completion) {
            completion(NO, nil);
            NSLog(@"Unable to fetch record error %@ with user info %@.", error, error.userInfo);
        }
    }];
}

Я получаю эту ошибку. Domain = AFNetworkingErrorDomain Code = -1011 "Ошибка запроса: внутренняя ошибка сервера (500). Может ли кто-нибудь сказать мне, что я делаю неправильно здесь? Получение ответа:

{ status code: 500, headers {
    "Cache-Control" = private;
    "Content-Length" = 509;
    "Content-Type" = "application/soap+xml; charset=utf-8";
    Date = "Thu, 13 Mar 2014 12:59:45 GMT";
    Server = "Microsoft-IIS/7.5";
    "X-AspNet-Version" = "2.0.50727";
    "X-Powered-By" = "ASP.NET";
} }
4b9b3361

Ответ 1

В вашем коде у вас есть:

[self POST:GET_CAR_BRAND parameters:Nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
          [formData appendPartWithHeaders:[NSDictionary dictionaryWithObjectsAndKeys:@"text/xml; charset=utf-8", @"Content-Type", msgLength, @"Content-Length", nil] body:[soapRequest dataUsingEncoding:NSUTF8StringEncoding]];

который определяет тип содержимого как "text/xml", а сервер явно ожидает "application/soap + xml". Вы должны попробовать изменить эту часть кода на:

[self POST:GET_CAR_BRAND parameters:Nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
          [formData appendPartWithHeaders:[NSDictionary dictionaryWithObjectsAndKeys:@"application/sopa+xml; charset=utf-8", @"Content-Type", msgLength, @"Content-Length", nil] body:[soapRequest dataUsingEncoding:NSUTF8StringEncoding]];

Обновленные предложения:

Попробуйте добавить:

[self.requestSerializer setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

в конце вашего метода - (instancetype)initWithBaseURL:(NSURL *)url.

Если это не поможет, я бы предложил выполнить более детальную отладку сетевого запроса. Вы можете, например, настройте AFNetworkActivityLogger, чтобы зарегистрировать информацию о запросе/ответе на консоль.

Ответ 2

Просто подумайте, осторожно, пока вы используете BASEURL с AFNetworking. Если вы отправляете точный URL-адрес конечной точки AFNetworking, он может выйти из строя.

Например,

У вас есть конечная точка URL = http://myweb.com/api.php

В приведенном выше случае, если вы используете AFNetworking, BASEURL != URL, тогда как это должно быть что-то вроде BASEURL=http://myweb.com/ и при вызове любого предложения запроса URL = api.php. AFNetworking добавляет BASEURL + URL и создает полный URL-адрес конечной точки.

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

Спасибо.

Ответ 3

Ошибка "Ошибка запроса: неприемлемый контент-тип: приложение/мыло + xml" генерируется

- (BOOL)validateResponse:(NSHTTPURLResponse *)response
                    data:(NSData *)data
                   error:(NSError * __autoreleasing *)error

метода AFHTTPResponseSerializer в случае неопределенного типа ответа MIME.

Вы можете исправить его следующим кодом

self.responseSerializer = [AFXMLParserResponseSerializer serializer];
NSSet *set = self.responseSerializer.acceptableContentTypes;
self.responseSerializer.acceptableContentTypes = [set setByAddingObject:@"application/soap+xml"];

или изменение AFXMLDocumentResponseSerializer - добавьте "application/soap + xml" к допустимым типам контента:

- (instancetype)init {
    self = [super init];
    if (!self) {
        return nil;
    }

    self.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml", @"application/soap+xml", nil];

    return self;
}

Следующее не решит эту проблему, я думаю,

[self.requestSerializer setValue:@"application/soap+xml" forHTTPHeaderField:@"Content-type"];

Недостаточно информации, чтобы понять, почему у вас есть запрос "Ошибка: ошибка внутреннего сервера (500)". Я отправлю правильные и неправильные запросы, которые мы постараемся вам помочь.

Ответ 4

Попробуйте этот код:

[self.requestSerializer setValue:@"application/soap+xml" forHTTPHeaderField:@"Accept"];