6

私は本当にこれに頭を悩ませています。Pocket APIを使用して、ユーザーが自分のアプリから Pocket の記事をアーカイブできるようにしていますが、以下のコードを使用してアーカイブしようとすると、常に次のエラーが発生します。

エラー Domain=PocketSDK Code=400 「無効なリクエストです。API ドキュメントを参照してください」 UserInfo=0xc17d3b0 {NSLocalizedDescription=無効なリクエストです。API ドキュメントを参照してください}

コード:

          NSDictionary *arguments = @{@"action": @"archive",
                                                 @"item_id": articleID};

          [[PocketAPI sharedAPI] callAPIMethod:@"send" withHTTPMethod:PocketAPIHTTPMethodPOST arguments:arguments handler:^(PocketAPI *api, NSString *apiMethod, NSDictionary *response, NSError *error) {
                if (!error) {
                     NSLog(@"Archived article.");
                }
          }];

それの正確にどの部分が間違っていますか?send メソッドを API に POST していませんか?

EDIT:@"action"上記のNSDictionaryを提供するように変更しましたが@"actions"、エラーなしで返されますが、Pocket Webサイトには影響しません...

EDIT 2: Joseph Chen の応答に従って、コードを次のように変更しました。

      // Create data to pass to the Pocket API (a JSON array of actions)
      NSError *error;
      NSArray *actions = @[@{@"action": @"archive",
                                    @"item_id": articleID}];
      NSData *actionsAsJSONData = [NSJSONSerialization dataWithJSONObject:actions options:kNilOptions error:&error];
      NSString *actionsAsJSONString = [[NSString alloc] initWithData:actionsAsJSONData encoding:NSUTF8StringEncoding];

      NSDictionary *arguments = @{@"actions": actionsAsJSONString};

      [[PocketAPI sharedAPI] callAPIMethod:@"send" withHTTPMethod:PocketAPIHTTPMethodPOST arguments:arguments handler:^(PocketAPI *api, NSString *apiMethod, NSDictionary *response, NSError *error) {
            if (!error) {
                 NSLog(@"%@", response);
            }
            else {
                 NSLog(@"%@", error);
            }
      }];

どちらが返されますか:

action_results" =     (
    1
);
status = 1;

しかし、ウェブサイトにアクセスしてログインすると、「アーカイブ」した記事がまだアーカイブされていない状態で目の前に表示されます。

4

2 に答える 2

3

ドキュメントによると、actionsパラメータは JSON ディクショナリである必要があります。だから、あなたはどちらか...

  1. JSON ディクショナリを手動で作成します。

    NSString *jsonString = [NSString stringWithFormat:@"[{\"action\":\"archive\",\"item_id\":\"%@\"}]", articleID]; // articleID is a NSString?
    NSDictionary *arguments = @{@"actions": jsonString};
    
  2. 使用NSJSONSerialization:

    NSDictionary *actions = @{@"action": @"archive", @"item_id": articleID};
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:actions
                                                       options:kNilOptions
                                                         error:&error];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData 
                                                 encoding:NSUTF8StringEncoding];
    NSDictionary *arguments = @{@"actions": jsonString};
    

こちらの回答も参考になります。

于 2014-01-15T12:39:26.777 に答える
1

これが私のアプリから(ほぼ)直接取られたコードです:

NSTimeInterval timestamp = [[NSDate date] timeIntervalSince1970];
NSDictionary *arguments = @{@"actions" : @[@{@"action" : @"archive",
                                             @"item_id" : itemId,
                                             @"time" : [NSString stringWithFormat:@"%ld", (long)timestamp]}]};

[self.pocketAPI callAPIMethod:@"send"
               withHTTPMethod:PocketAPIHTTPMethodPOST
                    arguments:arguments
                      handler:^(PocketAPI *api, NSString *apiMethod, NSDictionary *response, NSError *error)
 {
     if (!error) {
         // OK
     } else {
         // handle error
     }
 }];
于 2014-01-27T10:17:48.370 に答える