0

Clear Read APIにアクセスして、リンクから記事のテキストを抽出しています。APIは、このURLにパラメーターを入力することで機能http://api.thequeue.org/v1/clear?url=&format=します。URLの後に入力しhttp://www.nytimes.com/2013/03/25/business/global/cyprus-and-europe-officials-agree-on-outlines-of-a-bailout.html?hp&_r=0たり、フォーマットの後に入力したりできますjson

次に、JSONをステータスコード、、の形式で返し、記事のタイトル、そのURL、および抽出された記事のテキストitem内に返します。item

次のコードを使用して、AFNetworkingおよびAFHTTPClient(AFClearReadClientとしてサブクラス化)を介してこれとインターフェイスしようとしています。

私のAFClearReadClientクラス:

#import "AFClearReadClient.h"
#import "AFJSONRequestOperation.h"

@implementation AFClearReadClient

+ (AFClearReadClient *)sharedClient {
    static AFClearReadClient *sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClient = [[AFClearReadClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://api.thequeue.org/v1/clear?url=&format="]];
    });

    return sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url {
    if (self = [super initWithBaseURL:url]) {
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];
    }

    return self;
}

そして私のルートviewcontrollerで以下:

- (void)addArticlesToQueueFromList:(NSDictionary *)articles {
    // Restrict amount of operations that can occur at once
    [[AFClearReadClient sharedClient].operationQueue setMaxConcurrentOperationCount:5];

    // Create an array to hold all of our requests to make
    NSMutableArray *requestOperations = [[NSMutableArray alloc] init];

    for (NSString *key in articles) {
        // Create the request from the article's URL and the request parameters
        NSString *articleURL = [[articles objectForKey:key] objectForKey:@"resolved_url"];
        NSDictionary *requestParameters = @{@"url": articleURL,
                                            @"format": @"json"};
        NSMutableURLRequest *request = [[AFClearReadClient sharedClient] requestWithMethod:@"GET" path:nil parameters:requestParameters];

        // Create the request operation and specify behaviour on success and failure
        AFHTTPRequestOperation *requestOperation = [[AFClearReadClient sharedClient] HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
            // Get the item NSDictionary from the JSON responseObject
            NSDictionary *item = [responseObject objectForKey:@"item"];

            // Get the values needed to create an article
            NSString *title = [item objectForKey:@"title"];
            NSString *URL = [item objectForKey:@"link"];
            NSString *body = [item objectForKey:@"description"];

            // Create and add the article to our list of articles
            Article *article = [[Article alloc] initWithTitle:title URL:URL body:body];
            [self.articles insertObject:article atIndex:0];
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Request operation error");
        }];

        // Save the request operation in an NSArray so all can be enqueued later
        [requestOperations addObject:requestOperation];
    }

    // Enqueue the request operations
    [[AFClearReadClient sharedClient] enqueueBatchOfHTTPRequestOperations:requestOperations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
        NSLog(@"Processing...");
        [self.tableView reloadData];
    } completionBlock:^(NSArray *operations) {
        NSLog(@"Done!");
    }];
}

しかし、実行するたびに、テーブルビューにデータが入力されることを期待していました(RootViewControllerのarticles配列からセルを取得します)が、代わりにコンソールに次の情報が表示されます。

2013-03-25 11:31:35.470 [19020:c07] Processing...
2013-03-25 11:31:35.471 [19020:c07] Request operation error
2013-03-25 11:31:35.476 [19020:c07] Processing...
2013-03-25 11:31:35.476 [19020:c07] Request operation error
2013-03-25 11:31:35.477 [19020:c07] Processing...
2013-03-25 11:31:35.477 [19020:c07] Request operation error
2013-03-25 11:31:35.480 [19020:c07] Processing...
2013-03-25 11:31:35.480 [19020:c07] Request operation error
2013-03-25 11:31:35.481 [19020:c07] Processing...
2013-03-25 11:31:35.482 [19020:c07] Request operation error
2013-03-25 11:31:35.488 [19020:c07] Done!

正確には何が問題になっていますか?私はこれについて熟考しましたが、何が悪いのか理解できないようです。NSURLConnectionを一度に1つずつ使用した場合(私がやりたいことにはほとんど効率的ではありません)、それは機能しましたが、AFNetworkingで何かを台無しにしているようです。

それは私のrequestParameters変数と関係がありますか?Clear Read APIへのリクエストを間違って行っていますか?

4

1 に答える 1

1

エラーオブジェクトに何が含まれているかを確認する必要がありますが、getパラメータのキーが含まれているため、ベースURLは正しくないと思いますが、必要に応じてAFNetworkingから追加されます。

sharedClient = [[AFClearReadClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://api.thequeue.org/v1/clear?url=&format="]];

読む必要があります

sharedClient = [[AFClearReadClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://api.thequeue.org/v1/clear"]]

エラーを検査するには、

…
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Request operation error %@", [error localizedDescription]);
}];

http://api.thequeue.org/ベースURLを以下に設定することもできます

NSMutableURLRequest *request = [[AFClearReadClient sharedClient] requestWithMethod:@"GET" 
                                              path: [NSString stringWithFormat:@"/v1/clear?url=%@&format=json", articleURL]
                                        parameters:nil];

これが機能し、他の機能が機能しない場合は、APIのドキュメントに記載されている制限が原因であると思います。

重要:URLクエリは常に最初に来る必要があります。


プロジェクトを再作成しました。あなたの最初のコードをインデッドすると、この不正な形式のURLが生成されます。

 NSErrorFailingURLKey=http://api.thequeue.org/v1/clear/?url=&format=?format=json&url=http%3A%2F%2Fwww.nytimes.com%2F2013%2F03%2F25%2Fbusiness%2Fglobal%2Fcyprus-and-europe-officials-agree-on-outlines-of-a-bailout.html%3Fhp%26_r%3D0

そして私の修正で:

http://api.thequeue.org/v1/clear/?format=json&url=http%3A%2F%2Fwww.nytimes.com%2F2013%2F03%2F25%2Fbusiness%2Fglobal%2Fcyprus-and-europe-officials-agree-on-outlines-of-a-bailout.html

技術的には正しいのですが、URLパラメータが最初ではないため、APIはそこで制限されています。

于 2013-03-25T15:01:59.240 に答える