AFHTTPSessionManager 子类:带有正文的发布 API。

Posted

技术标签:

【中文标题】AFHTTPSessionManager 子类:带有正文的发布 API。【英文标题】:AFHTTPSessionManager Subclass: Post API with body. 【发布时间】:2014-04-17 19:00:11 【问题描述】:

我想出了如何使用 AFnetworking 传递参数,但我很难弄清楚如何将正文作为我的 API 调用的一部分传递。目前这就是我所做的:

    - (void)authenticateUser:(NSString *)username
                password:(NSString *)password
                success:(void (^) (NSString *accessToken))success
                failure:(RequestFailureBlock)failure

    NSString *authURL = @"http://someurlforauthentication";
    NSDictionary *parameters = @@"username" : username,
                                 @"password" : password ;

    [self.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];




    [self POST:authURL parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject)

        NSString *accessToken = responseObject[@"access_token"];

        // Store Access Token
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:accessToken forKey:APIAuthorizationToken];
        [defaults synchronize];

        NSLog(@"Hello %@", accessToken);

        success(accessToken);

     failure:failure];

我需要做的不是传递任何参数,而是传递一个带有包含登录凭据的 json 字符串的正文。像这样的

 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

// Body

const char bytes[43] = "\n \"username\": \"max\",\n \"password\": \"pass\"\n";
request.HTTPBody = [NSData dataWithBytes:bytes length:43];

提前致谢。

【问题讨论】:

【参考方案1】:

使用 AFJSONRequestSerializer 和 AFJSONResponseSerializer 你可以做你想做的事。然后只需使用您用于发布的代码即可。整个过程应该如下所示:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:configuration];
    [manager setRequestSerializer:[AFJSONRequestSerializer serializer]];
    [manager setResponseSerializer:[AFJSONResponseSerializer serializer]];

    NSDictionary *parameters = @@"test": @"this is a test";

    [manager POST:@"http://localhost:8080/TestRequest/test" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) 

        NSLog(@"%@",[responseObject description]);

     failure:^(NSURLSessionDataTask *task, NSError *error) 

        NSLog(@"%@",[error localizedDescription]);
    ];

【讨论】:

问题是我上面的代码中没有请求。我正在继承 AFHTTPSessionManager。您能否说明如何将其添加到我在帖子中的代码中? 我已经更新了我的答案。希望能帮助到你。上面的代码接受一个 json 输入并返回一个 json 输出。 我认为这个答案没有完全回答这个问题。除非在这篇文章之后标题改变了,否则你有参数,但没有正文。没有 HTTPBody(例如 Swift 2.3 - let request = NSMutableURLRequest(URL: url); ... request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(someDict as AnyObject, options: .PrettyPrinted);)。我看到 URL 端点上正在加载参数,但没有 HTTPBody。我错了,没有看到尸体?

以上是关于AFHTTPSessionManager 子类:带有正文的发布 API。的主要内容,如果未能解决你的问题,请参考以下文章

快速使用 AFHTTPSessionManager

2 AFHTTPSessionManager

使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager

如何使用 AFHTTPSessionManager 访问 422 上的响应正文?

更改 AFHTTPSessionManager 的基本 URL

Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?