Есть ли пример публикации AFHTTPClient json с AFNetworking?
Ищем пример публикации json с помощью AFHTTPClient
. Я вижу, что существует метод postPath, который принимает NSDictionary
, а метод AFJSONEncode возвращает NSData
. Есть ли простой способ сериализации объекта в NSDictionary
, или есть более простой способ использования jsonkit?
Мне просто нужно отправить объект json в REST API.
UPDATE: Итак, я попытался передать словарь, но, похоже, он прервал сериализацию вложенного массива.
Например, если у меня есть объект:
Post* p = [[Post alloc] init];
p.uname = @"mike";
p.likes =[NSNumber numberWithInt:1];
p.geo = [[NSArray alloc] initWithObjects:[NSNumber numberWithFloat:37.78583], [NSNumber numberWithFloat:-122.406417], nil ];
p.place = @"New York City";
p.caption = @"A test caption";
p.date = [NSDate date];
у кого есть словарь, есть такие данные, как:
{
caption = "A test caption";
date = "2011-12-13 17:58:37 +0000";
geo = (
"37.78583",
"-122.4064"
);
likes = 1;
place = "New York City";
}
сериализация будет либо просто неработоспособной, либо geo не будет сериализована как массив, а как строковый литерал, например ("37.78583", "-122.4064");
Ответы
Ответ 1
Если вы отправляете в JSON REST API, должно быть определенное сопоставление свойств объекта с ключом JSON, правильно? То есть сервер ожидает определенную информацию в определенных именованных полях.
Итак, что вы хотите сделать, это построить NSDictionary
или NSMutableDictionary
с помощью ключей, используемых в API, и их соответствующих значений. Затем просто передайте этот словарь в аргумент parameters
любого метода запроса в AFHTTPClient
. Если для свойства parameterEncoding
для клиента установлено значение AFJSONParameterEncoding
, то тело запросов будет автоматически закодировано как JSON.
Ответ 2
Лучший и простой способ сделать это - подкласс AFHTTPClient.
Используйте этот фрагмент кода
MBHTTPClient
#define YOUR_BASE_PATH @"http://sample.com"
#define YOUR_URL @"post.json"
#define ERROR_DOMAIN @"com.sample.url.error"
/**************************************************************************************************/
#pragma mark - Life and Birth
+ (id)sharedHTTPClient
{
static dispatch_once_t pred = 0;
__strong static id __httpClient = nil;
dispatch_once(&pred, ^{
__httpClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:YOUR_BASE_PATH]];
[__httpClient setParameterEncoding:AFJSONParameterEncoding];
[__httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
//[__httpClient setAuthorizationHeaderWithUsername:@"" password:@""];
});
return __httpClient;
}
/**************************************************************************************************/
#pragma mark - Custom requests
- (void) post<#Objects#>:(NSArray*)objects
success:(void (^)(AFHTTPRequestOperation *request, NSArray *objects))success
failure:(void (^)(AFHTTPRequestOperation *request, NSError *error))failure
{
[self postPath:YOUR_URL
parameters:objects
success:^(AFHTTPRequestOperation *request, id JSON){
NSLog(@"getPath request: %@", request.request.URL);
if(JSON && [JSON isKindOfClass:[NSArray class]])
{
if(success) {
success(request,objects);
}
}
else {
NSError *error = [NSError errorWithDomain:ERROR_DOMAIN code:1 userInfo:nil];
if(failure) {
failure(request,error);
}
}
}
failure:failure];
}
Затем в вашем коде просто вызовите
[[MBHTTPClient sharedHTTPClient] post<#Objects#>:objects
success:^(AFHTTPRequestOperation *request, NSArray *objects) {
NSLog("OK");
}
failure:(AFHTTPRequestOperation *request, NSError *error){
NSLog("NOK %@",error);
}
object - это NSArray (вы можете изменить его на NSDictonary) и будет кодироваться в формате JSON
Ответ 3
- (NSMutableURLRequest *)requestByPostWithNSArrayToJSONArray:(NSArray *)parameters
{
NSURL *url = [NSURL URLWithString:@"" relativeToURL:self.baseURL];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:self.defaultHeaders];
if (parameters)
{
NSString *charset = (__bridge NSString *)CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding));
NSError *error = nil;
[request setValue:[NSString stringWithFormat:@"application/json; charset=%@", charset] forHTTPHeaderField:@"Content-Type"];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wassign-enum"
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error]];
#pragma clang diagnostic pop
if (error) {
NSLog(@"%@ %@: %@", [self class], NSStringFromSelector(_cmd), error);
}
}
return request;
}
AFHTTPClient *httpClient = [[AFHTTPClient alloc]initWithBaseURL:[NSURL URLWithString:URL_REGISTER_DEVICE]];
NSArray *array = @[@"hello", @"world"];
NSMutableURLRequest *request = [httpClient requestByPostWithNSArrayToJSONArray:array];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
NSLog(@"network operation succ");
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"network operation fail");
}];
[operation start];