Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在body和URL中使用参数制作经过身份验证的帖子?_Ios_Objective C_Afnetworking_Afnetworking 2 - Fatal编程技术网

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..