代码之家  ›  专栏  ›  技术社区  ›  roof

AFNetworking 2.0始终返回403

  •  0
  • roof  · 技术社区  · 10 年前

    我正在使用AFNetworking 2.0对JSON进行GET请求

        self.managerMasterFetchDeletes = [AFHTTPRequestOperationManager manager];
            self.managerMasterFetchDeletes.requestSerializer.timeoutInterval = 4.0f;
            self.managerMasterFetchDeletes.requestSerializer = [AFJSONRequestSerializer serializer];
            self.managerMasterFetchDeletes.responseSerializer = [AFJSONResponseSerializer serializer];
    
    NSURL *URL = [NSURL URLWithString:rest];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        op.responseSerializer = [AFJSONResponseSerializer serializer];
    
        [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            if (operation.response.statusCode==200){
    
                NSDictionary *dictionary   = (NSDictionary*)responseObject;
                NSMutableDictionary *responseData = [NSMutableDictionary new];
                if ([dictionary objectForKey:@"responseData"]) {
                    responseData = [[dictionary objectForKey:@"responseData"] mutableCopy];
                }
                [responseData setValue:entity forKey:@"entityName"];
                [responseData setValue:[NSNumber numberWithInt:timeStamp] forKey:@"lastSync"];
                [[NSNotificationCenter defaultCenter]
                 postNotificationName:notification
                 object:nil userInfo:responseData];
    
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];
    
     NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:[arrayOperations copy] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
            NSLog(@"%lu of %lu fetch delete complete", numberOfFinishedOperations, totalNumberOfOperations);
        } completionBlock:^(NSArray *operations) {
            NSLog(@"All operations in batch complete");
            [[NSNotificationCenter defaultCenter]
             postNotificationName:@"MasterFecthDeleteEnd"
             object:nil
             userInfo:nil];
        }];
    
        [self.managerMasterFetchDeletes.operationQueue addOperations:operations waitUntilFinished:NO];
    

    但它总是返回403,并返回以下错误:不可接受的内容类型:text/html

    奇怪的是,我对Cocoa Graphical HttpClient所做的相同请求没有问题,并返回JSON响应,如下所示:

    内容类型:application/json;字符集=UTF-8 日期:2015年9月25日星期五15:28:27 GMT 传输编码:标识 X-Powered-By:Servlet/2.5 JSP/2.1

    非常感谢。

    2 回复  |  直到 10 年前
        1
  •  2
  •   Mehul Sojitra    10 年前

    服务器似乎发送text/html ContentTypes。 要接受此类型的内容,请添加text/html acceptableContentTypes .

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    
    }];
    
        2
  •  2
  •   Piyush    10 年前

    这意味着您的服务器正在发送 "text/html" 而不是已经支持的类型。我的解决方案是添加 “text/html” 到中设置的acceptableContentTypes AFURLResponseSerialization 班只需搜索“acceptableContentTypes”并添加 @"text/html" 手动设置。

    op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    

    当然,理想的解决方案是更改从服务器发送的类型,但为此,您必须与服务器团队讨论。

    你可以这样做。

    NSURL *URL = [NSURL URLWithString:rest];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
        op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    
        [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
            if (operation.response.statusCode==200){
    
                NSDictionary *dictionary   = (NSDictionary*)responseObject;
                NSMutableDictionary *responseData = [NSMutableDictionary new];
                if ([dictionary objectForKey:@"responseData"]) {
                    responseData = [[dictionary objectForKey:@"responseData"] mutableCopy];
                }
                [responseData setValue:entity forKey:@"entityName"];
                [responseData setValue:[NSNumber numberWithInt:timeStamp] forKey:@"lastSync"];
                [[NSNotificationCenter defaultCenter]
                 postNotificationName:notification
                 object:nil userInfo:responseData];
    
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];