2014-01-13 1 views
5

Я пытаюсь использовать Diffbot для анализа некоторых URL-адресов в соответствующей части статьи. У них есть «API-интерфейс статьи», который позволяет вам одновременно отправлять по одной ссылке и получать ее обратно, но для скорости я бы предпочел использовать Batch API, который в основном позволяет вам отправлять кучу запросов API статьи в один большой запрос и получите один большой ответ, а не один за раз.Как отправить массив JSON в этот API?

Вот что Batch API описаны в их документации (что странно за входа стены):

enter image description here

Я подчиняясь статьи API, как так:

NSURLRequest *request = [[AFDiffbotClient sharedClient] 
          requestWithMethod:@"GET" 
          path:[NSString stringWithFormat:@"article?token=MYTOKEN&fields=url,text,title&url=%@", URL] 
          parameters:nil]; 

И он работает отлично. AFDiffbotClient - это одноэлементный код в сочетании с AFNetworking, чтобы облегчить запрос, а параметр URL - это только URL-адрес статьи, на которую я смотрю. (Возможно, я мог бы сделать это, не создавая URL вручную, бонусные баллы, если бы кто-нибудь мог предложить советы по этому поводу.)

Однако с помощью Batch API вы должны отправить (POST) кучу этих запросов как массив JSON. Я смущен, как бы я это сделал.


EDIT: Я работал еще немного на нем, и добились определенного прогресса, но я получаю ошибку 400 назад. Я не могу понять, что я делаю неправильно, но я должен идти по правильному пути. Я передаю параметры в запросе POST с моим токеном и моим массивом JSON, но он все равно не сработает.

[AFDiffbotClient sharedClient].operationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; 
NSMutableArray *DiffbotRequests = [[NSMutableArray alloc] init]; 

for (NSDictionary *URLAndID in URLsAndIDs) { 
    NSString *articleURL = [URLAndID objectForKey:@"URL"]; 
    NSDictionary *request = @{@"token": @"TOKEN", 
           @"fields": @"text,title,url", 
           @"url": articleURL}; 

    [DiffbotRequests addObject:request]; 
} 

NSError *error; 
NSData *DiffbotRequestsJSONData = [NSJSONSerialization dataWithJSONObject:DiffbotRequests options:kNilOptions error:&error]; 
NSString *DiffbotRequestsJSONString = [[NSString alloc] initWithData:DiffbotRequestsJSONData encoding:NSUTF8StringEncoding]; 

NSDictionary *parameters = @{@"token": @"TOKEN", 
          @"batch": DiffbotRequestsJSONString}; 

[[AFDiffbotClient sharedClient] getPath:@"batch" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"%@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"%@", error); 
}]; 

И вот ответ я получаю обратно:

Ошибка домена = AFNetworkingErrorDomain Code = -1011 "Ожидаемый код состояния в (200-299), получил 400" UserInfo = 0xc2ee4d0 {NSLocalizedRecoverySuggestion =, AFNetworkingOperationFailingURLRequestErrorKey = {URL:

И после этого это всего лишь все URL-адреса, которые я отправил.

EDIT 2: Добавлено изображение API выше.

EDIT 3: ток, unworking код:

[AFDiffbotClient sharedClient].operationQueue.maxConcurrentOperationCount = NSOperationQueueDefaultMaxConcurrentOperationCount; 
NSMutableArray *DiffbotRequests = [[NSMutableArray alloc] init]; 

for (NSDictionary *URLAndID in URLsAndIDs) { 
    NSString *articleURL = [URLAndID objectForKey:@"URL"]; 
    NSDictionary *request = @{@"token": @"TOKEN", 
           @"fields": @"text,title,url", 
           @"url": articleURL}; 

    [DiffbotRequests addObject:request]; 
} 

NSError *error; 
NSData *DiffbotRequestsJSONData = [NSJSONSerialization dataWithJSONObject:DiffbotRequests options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *DiffbotRequestsJSONString = [[NSString alloc] initWithData:DiffbotRequestsJSONData encoding:NSUTF8StringEncoding]; 

NSDictionary *parameters = @{@"token": @"TOKEN", 
          @"batch": DiffbotRequestsJSONString}; 


[[AFDiffbotClient sharedClient] setParameterEncoding:AFJSONParameterEncoding]; 
[[AFDiffbotClient sharedClient] postPath:@"batch" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"%@", responseObject); 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"%@", error); 
}]; 
+0

Чтобы произвести ряд вещей, в формате JSON, положить вещи в NSArray, а затем использовать NSJSONSerialization для преобразования в объект NSData. Но обратите внимание, что вещи в NSArray должны быть строками, числами, словарями или другими массивами. ** См. Json.org для синтаксиса, который должен привести. ** Что касается того, как должны выглядеть отдельные запросы, это зависит от людей на другом конце. Вероятно, NSDictionary (который JSON вызывает «объект»). –

+0

Doug, в вызове 'dataWithJSONObject', после этого проверьте' error'. И NSLog 'DiffbotRequestsJSONString', и посмотрим, посмотрим, выглядит ли это правильно. –

+0

Вы должны делать POST, а не GET. – SK9

ответ

1

Это неофициальная:

NSURLRequest *request = [[AFDiffbotClient sharedClient] requestWithMethod:@"GET" path: [NSString stringWithFormat:@"article?token=MYTOKEN&fields=url,text,title&url=%@", URL] parameters:nil]; 

Лучший способ:

NSArray *paramters = @[@"token": @"MYTOKEN", 
         @"fields": @"url,text,title", 
         @"url":@"aURL" 
         ] 
    NSURLRequest *request = [[AFDiffbotClient sharedClient] requestWithMethod:@"GET" path:@"article" parameters:parameters]; 

Параметры будут URL-закодирован в ваш Наконец, URL-адрес кажется вашим источником.

Если вы хотите POST JSONArray, вы должны использовать метод POST, и есть postObject. А также вы должны установить метод postObject закодировать как:

typedef enum { 
    AFFormURLParameterEncoding, 
    AFJSONParameterEncoding, 
    AFPropertyListParameterEncoding, 
} AFHTTPClientParameterEncoding; 
+0

Спасибо за ответ параметра, но я все еще запутался для поставки массива JSON запросов. Я понимаю, что POST это, но я не уверен в том, что * точно, чтобы публиковать, как в том, что он должен содержать, и какова должна быть структура данных. –

+0

вы должны исследовать HTTP-протокол http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol, многие люди не знают, как данные отправляются на сервер – aelam

+0

Вы меня недопонимаете, я понимаю, как данные отправляются на сервер. * В контексте Objective-C я не знаю, что отправить и как его построить. * –

0

Заменить текущий код с этой варианты: NSJSONWritingPrettyPrinted:

NSData *DiffbotRequestsJSONData = [NSJSONSerialization dataWithJSONObject:DiffbotRequests options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *DiffbotRequestsJSONString = [[NSString alloc] initWithData:DiffbotRequestsJSONData encoding:NSUTF8StringEncoding]; 

NSDictionary *parameters = @{@"token": @"TOKEN", 
          @"batch": DiffbotRequestsJSONString}; 

Edit:

Точный кусок код, который вы опубликовали, плюс options:NSJSONWritingPrettyPrinted работал для меня каждый раз, когда мне нужно было размещать на сервере массив JSON. Я бы предложил создать файл php со следующим кодом и отправить туда запрос. Таким образом, вы точно знаете, что вы отправляете, по сравнению с тем, что ожидает сервер, и, конечно же, что вам не хватает.

<?php 
set_time_limit(0); 
mail("[email protected]",basename(__FILE__).' - Recieved',var_export($HTTP_RAW_POST_DATA,true)); 
?> 
+0

Изменение параметров привело к той же проблеме. –

+0

@DougSmith Читать мой отредактированный ответ. – Segev

+0

Используя Charles (как указал другой пользователь, он отслеживает исходящий трафик), я получил это как свой запрос на «JSON Text»: gist.github.com/christianselig/a379f46d2826644075f2, и он показывает это в разделе «JSON», указывая, что, возможно, m не публиковать JSON и просто строку? i.imgur.com/1duXDIS.png –

0

Ваш код на самом деле не посылает POST, это похоже на GET. Вам необходимо использовать метод POST AFNetworking.

Я не вижу, что ожидает сервер, потому что вам нужна учетная запись, но вы должны проверить, что она фактически отправила на то, что ожидает сервер. Используйте инструмент, например Charles, чтобы записать то, что отправлено, чтобы вы могли его изучить.

При использовании AFNetworking вам необходимо установить тип сериализации (вы говорите, что это JSON), по умолчанию обычно будет кодироваться URL-адрес. Затем словарь параметров, который вы передадите, будет преобразован в JSON.


Ваш снимок экрана API спецификации, это неправильно:

NSDictionary *request = @{@"token": @"TOKEN", 
          @"fields": @"text,title,url", ... 

Потому что вы должны поставлять метод и URL (где URL содержит маркер и такие).

Ваш скриншот показывает образец JSON, сделайте свой вывод в Чарльзе похожим на это.

+0

Используя Charles, я получил это как свой запрос на «JSON Text»: https://gist.github.com/christianselig/a379f46d2826644075f2, и он показывает это под «JSON», указывая, что, возможно, я не отправляю JSON и просто строку ? http://i.imgur.com/1duXDIS.png –

+0

И вот что мой код в данный момент, с моим токеном удален: https://gist.github.com/christianselig/3ac65340b4c4bfb4f75f –

+0

Похож на JSON. Но что ожидает сервер? – Wain

1

Для AFNetworking 2,0
Ниже кода показывает, как вы можете передать словарь ключевых пар значений к URL

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 

NSDictionary *parameters = @{@"token": @"TOKEN"}; // you can add as many parameters as you want it in this dictionary in your case 

parameters = nil; // **to show this sample code works** i have set **parameters to nil** 

// if you want to sent parameters you can use above code 

manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

[manager POST:@"http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
{ 

    NSLog(@"JSON: %@", responseObject); 


    }failure:^(AFHTTPRequestOperation *operation, NSError *error) 
{ 
    NSLog(@"Error: %@", error); 
}];