Я использую AFNetworking 2.0 в своем приложении. Я заметил, что если мой веб-сервис возвращает код состояния 500, я не получаю тело ответа.AFNetworking 500 тело ответа
Вот пример моего кода PHP
try
{
$conn = new PDO("sqlsrv:server=$serverName;Database = $database", $uid, $pwd);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $conn;
}
catch(PDOException $e)
{
$response->status(500);
echo("Connection Error: " . $e->getMessage());
}
Если я использую простой клиент остального этот пример тела ответа.
Connection Error: SQLSTATE[08001]: [Microsoft][SQL Server Native Client 11.0]SQL Server Network Interfaces: Error Locating Server/Instance Specified [xFFFFFFFF].
Однако это, кажется, единственный ответ, который я могу получить от AFNetworking
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x15e58fa0 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
Это часть моей Objective-C код, который делает это.
...} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"%@",error.description);
}];
Есть ли способ получить тело ответа?
Edit: Подробнее Код для осветления
Ниже часть моего подкласса AFHTTPSessionManager
@implementation MSMAMobileAPIClient
+ (MSMAMobileAPIClient *)sharedClient {
static MSMAMobileAPIClient *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[MSMAMobileAPIClient alloc] initWithDefaultURL];
});
return _sharedClient;
}
- (id)initWithDefaultURL {
return [self initWithBaseURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://%@/mamobile/index.php/" ,[[NSUserDefaults standardUserDefaults] stringForKey:@"serviceIPAddress"]]]];
}
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
self.responseSerializer = [AFCompoundResponseSerializer compoundSerializerWithResponseSerializers:@[[AFJSONResponseSerializer serializer], [AFHTTPResponseSerializer serializer]]];
return self;
}
Я попытался установить сериалайзер ответ на AFCompoundResponseSerializer, но это не похоже, чтобы сделать разницу
Ниже приведен пример подкласса, который я называю Библиотекарем.
-(void)searchForItemWithString:(NSString *)searchString withCompletionBlock:(arrayBlock)block {
self.inventorySearchBlock = block;
NSDictionary *parameters = @{@"query": searchString};
[[MSMAMobileAPIClient sharedClient] GET:@"inventory/search" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
if (!responseObject) {
NSLog(@"Error parsing JSON");
} else {
//do stuff with the json dictionary that's returned..
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error: %@",error.description);
}];
}
Помните, что установка значения 'nil' в' userInfo [JSONResponseSerializerWithDataKey] 'приведет к исключению. обходите это, используйте KVC. setValue: forKey: 'сначала проверяет значение, если это' nil'. Если это так, он обрабатывает инструкцию так, как если бы вы вызвали 'removeObject ForKey: вместо этого, который будет изящно ничего не делать, если объекта нет. – Baub
@ Джеймс, ты предлагаешь это вместо этого? [userInfo setValue: [[NSString alloc] initWithData: кодировка данных: NSUTF8StringEncoding] forKey: JSONResponseSerializerWithDataKey]; – Hackmodford
Именно так. – Baub