Ios 如何在body和URL中使用参数制作经过身份验证的帖子?
由于服务器的限制,我需要制作一个Ios 如何在body和URL中使用参数制作经过身份验证的帖子?,ios,objective-c,afnetworking,afnetworking-2,Ios,Objective C,Afnetworking,Afnetworking 2,由于服务器的限制,我需要制作一个POST,其中包括URL和正文中的参数。我正在使用AFHTTPRequestOperationManager的HTTPRequestOperationWithRequest方法来实现这一点,因为我可以使用如下URL参数初始化URL请求: NSMutableURLRequest*request=[NSMutableURLRequest requestWithURL:components.URL] 然后我可以单独设置POST的主体,如下所示: [请求setHTTPBo
POST
,其中包括URL和正文中的参数。我正在使用AFHTTPRequestOperationManager
的HTTPRequestOperationWithRequest
方法来实现这一点,因为我可以使用如下URL参数初始化URL请求:
NSMutableURLRequest*request=[NSMutableURLRequest requestWithURL:components.URL]代码>
然后我可以单独设置POST
的主体,如下所示:
[请求setHTTPBody:[jsonString数据使用编码:NSUTF8StringEncoding]]代码>
当我将AFHTTPRequestOperationManager
的requestSerializer
设置为使用授权头令牌时,就会出现问题。请求以401 unauth
的形式返回。但是,如果我直接将请求对象的头设置为:
[请求设置值:HttpHeaderField的self.accessToken:@“授权”]代码>
呼叫成功。有谁知道一种更好的方法来进行身份验证调用,同时在POST
的主体和URL中发送参数?我的实现似乎不太理想。除非您需要支持iOS6,否则我认为您应该使用AFHTTPSessionManager而不是AFHTTPRequestOperationManager
子类AFHTTPSessionManager和override:
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
uploadProgress:(void (^)(NSProgress * _Nonnull))uploadProgressBlock
downloadProgress:(void (^)(NSProgress * _Nonnull))downloadProgressBlock
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler {
NSMutableURLRequest *modifiedRequest = request.mutableCopy;
NSString *token = [Get your access token];
[modifiedRequest addValue:token forHTTPHeaderField:@"Authorization"];
// Now set up the data task as normal
return [super dataTaskWithRequest:modifiedRequest
uploadProgress:uploadProgressBlock
downloadProgress:downloadProgressBlock
completionHandler:completionHandler];
}
它的结果与您的方法相同(我不知道有更好的方法),但可以确保所有调用都自动执行
将会话管理器初始化为子类的实例
然后使用AFNetworking的POST方法,设置参数并执行以下操作:
NSDictionary *params = @{@"Param1":param1 ? param1 : @"",
@"Param2":param2 ? param2 : @""};
[self.sessionManager
POST:self.serviceEndpointUrl
parameters:params
etc..
除非您需要支持iOS6,否则我认为您应该使用AFHTTPSessionManager而不是AFHTTPRequestOperationManager
子类AFHTTPSessionManager和override:
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
uploadProgress:(void (^)(NSProgress * _Nonnull))uploadProgressBlock
downloadProgress:(void (^)(NSProgress * _Nonnull))downloadProgressBlock
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler {
NSMutableURLRequest *modifiedRequest = request.mutableCopy;
NSString *token = [Get your access token];
[modifiedRequest addValue:token forHTTPHeaderField:@"Authorization"];
// Now set up the data task as normal
return [super dataTaskWithRequest:modifiedRequest
uploadProgress:uploadProgressBlock
downloadProgress:downloadProgressBlock
completionHandler:completionHandler];
}
它的结果与您的方法相同(我不知道有更好的方法),但可以确保所有调用都自动执行
将会话管理器初始化为子类的实例
然后使用AFNetworking的POST方法,设置参数并执行以下操作:
NSDictionary *params = @{@"Param1":param1 ? param1 : @"",
@"Param2":param2 ? param2 : @""};
[self.sessionManager
POST:self.serviceEndpointUrl
parameters:params
etc..