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。的主要内容,如果未能解决你的问题,请参考以下文章
使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager
如何使用 AFHTTPSessionManager 访问 422 上的响应正文?