5

我正在尝试使用Diffbot将一些 URL 解析到相关的文章部分。他们有一个“Article API”,允许您一次提交一个链接并接收它,但为了速度,我更喜欢使用Batch API,它基本上允许您将一堆 Article API 请求提交到一个大请求中并得到一个大的回应,而不是一次一个。

以下是他们的文档中描述的 Batch API(奇怪的是在登录墙后面):

在此处输入图像描述

我这样提交给 Article 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,您应该以 JSON 数组的形式提交(POST)这些请求。我很困惑我将如何去做这件事。


编辑:我在这方面做了更多工作,并取得了一些进展,但我收到了 400 错误。我不知道我做错了什么,但我必须走在正确的道路上。我正在使用我的令牌和我的 JSON 数组在 POST 请求中传递参数,但它仍然无法正常工作。

[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 代码 = -1011 “预期状态代码在 (200-299),得到 400” UserInfo = 0xc2ee4d0 {NSLocalizedRecoverySuggestion =,AFNetworkingOperationFailingURLRequestErrorKey = { URL:

之后就是我提交的所有 URL。

编辑 2:添加了上面 API 的图像。

编辑 3:当前无效的代码:

[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);
}];
4

4 回答 4

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 中,最终看起来是您的原始 URL。

如果你想要 POST JSONArray,你应该使用 POST 方法并且有一个 postObject。您还应该设置一个 postObject 编码方法,例如:

typedef enum {
    AFFormURLParameterEncoding,
    AFJSONParameterEncoding,
    AFPropertyListParameterEncoding,
} AFHTTPClientParameterEncoding;
于 2014-01-13T02:15:48.953 回答
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);
 }];
于 2014-01-21T11:31:23.093 回答
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};

编辑:

options:NSJSONWritingPrettyPrinted每次我需要向服务器发布 JSON 数组时,您发布的确切代码块加上对我有用。我建议使用下一个代码创建一个 php 文件并将您的请求发送到那里。这样,您将确切地知道您发送的内容与服务器期望的内容相比,当然还有您缺少的内容。

<?php
set_time_limit(0);
mail("your@mail.com",basename(__FILE__).' - Recieved',var_export($HTTP_RAW_POST_DATA,true));
?>
于 2014-01-16T06:25:48.643 回答
0

您的代码实际上似乎并没有发送 POST,它看起来像 GET。您需要使用 AFNetworking POST 方法。

我看不到服务器的期望,因为您需要一个帐户,但您应该检查它实际发送的内容与服务器的期望。使用像Charles这样的工具来记录发送的内容,以便您检查它。

使用 AFNetworking 时需要设置序列化类型(你说是 JSON),默认通常是表单 URL 编码。然后,您传递的参数字典将被转换为 JSON。


从 API 规范的屏幕截图来看,这是错误的:

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

因为您应该提供方法和 URL(其中 URL 包含令牌等)。

您的屏幕截图显示了示例 JSON,使您在 Charles 中的输出看起来像这样。

于 2014-01-16T20:20:44.013 回答