Ответ Parse JSON с AFNetworking
Я установил пост JSON с AFNetworking
в Objective-C и отправил данные на сервер со следующим кодом:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"name": deviceName, @"model": modelName, @"pin": pin};
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"Content-Type" forHTTPHeaderField:@"application/json"];
[manager POST:@"SENSORED_OUT_URL" parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"JSON: %@", responseObject);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
NSLog(@"Error: %@", error);
}];
Я получаю информацию по одному и тому же запросу и хочу отправить данные в NSString
. Как мне это сделать с помощью AFNetworking
?
Ответы
Ответ 1
responseObject
является либо NSArray, либо NSDictionary. Во время выполнения можно проверить с помощью isKindOfClass:
:
if ([responseObject isKindOfClass:[NSArray class]]) {
NSArray *responseArray = responseObject;
/* do something with responseArray */
} else if ([responseObject isKindOfClass:[NSDictionary class]]) {
NSDictionary *responseDict = responseObject;
/* do something with responseDict */
}
Если вам действительно нужна строка JSON, она доступна, посмотрев на operation.responseString
.
Ответ 2
В этом случае, когда веб-служба отвечает JSON
, AFNetworking
выполнит сериализацию для вас, а responseObject
скорее всего будет либо объектом NSArray
, либо NSDictionary
.
Такой объект должен быть более полезен для вас, чем строка с содержимым JSON
.
Ответ 3
В моем случае это похоже (возможно, это может помочь)
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager POST:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *jsonDict = (NSDictionary *) responseObject;
//!!! here is answer (parsed from mapped JSON: {"result":"STRING"}) ->
NSString *res = [NSString stringWithFormat:@"%@", [jsonDict objectForKey:@"result"]];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//....
}
];
Также было бы замечательно проверить тип объекта ответа (например, fooobar.com/questions/448919/...)
Ответ 4
Я считаю, что лучше всего подходит для подкласса AFHTTPClient следующим образом:
// MyHTTPClient.h
#import <AFNetworking/AFHTTPClient.h>
@interface MyHTTPClient : AFHTTPClient
+ (instancetype)sharedClient;
@end
// MyHTTPClient.m
#import "MyHTTPClient.h"
#import <AFNetworking/AFJSONRequestOperation.h>
static NSString *kBaseUrl = @"http://api.blah.com/yada/v1/";
@implementation MyHTTPClient
+ (instancetype)sharedClient {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (id)init {
if (self = [super initWithBaseURL:[NSURL URLWithString:kBaseUrl]]) {
self.parameterEncoding = AFJSONParameterEncoding;
[self setDefaultHeader:@"Accept" value:@"application/json"]; // So AFJSONRequestOperation becomes eligible for requests.
[self registerHTTPOperationClass:[AFJSONRequestOperation class]]; // So that it gets used for postPath etc.
}
return self;
}
@end
Важными битами являются:
- Установка "Принять" таким образом, чтобы получить доступ к AFJSONRequestOperation.
- Добавление AFJSONRequestOperation в классы операций http.
Затем вы можете использовать его так:
#import "MyHTTPClient.h"
@implementation UserService
+ (void)createUserWithEmail:(NSString *)email completion:(CreateUserCompletion)completion {
NSDictionary *params = @{@"email": email};
[[MyHTTPClient sharedClient] postPath:@"user" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
completion([responseObject[@"userId"] intValue], YES);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
completion(0, NO);
}];
}
@end
Красота заключается в том, что ваш responseObject автоматически обрабатывается JSON в словаре (или массиве) для вас. Очень чистый.
(это для ассемблирования 1.x)