如何使用2个参数进行POST NSURLRequest?

l.v*_*lev 9 post objective-c nsurlrequest ios

我想添加2个参数NSURLRequest.有没有办法或者我应该使用AFnetworking?

Rob*_*Rob 32

如果您使用AFNetworking,可能会更容易.如果您有自己想做的事情,可以使用NSURLSession,但必须编写更多代码.

  1. 如果您使用AFNetworking,它会处理序列化请求,区分成功和错误等所有这些细节:

    NSDictionary *params = @{@"firstname": @"John", @"lastname": @"Doe"};
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:urlString parameters:params success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"responseObject = %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"error = %@", error);
    }];
    
    Run Code Online (Sandbox Code Playgroud)

    这假设服务器的响应是JSON.如果不是(例如,如果是纯文本或HTML),则可以在POSTwith 之前:

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果你自己做NSURLSession,你可以像这样构造请求:

    NSDictionary *params = @{@"firstname": @"John", @"lastname": @"Doe"};
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[self httpBodyForParameters:params]];
    
    Run Code Online (Sandbox Code Playgroud)

    您现在可以发起请求NSURLSession.例如,您可能会这样做:

    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"dataTaskWithRequest error: %@", error);
        }
    
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
            NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
            if (statusCode != 200) {
                NSLog(@"Expected responseCode == 200; received %ld", (long)statusCode);
            }
        }
    
        // If response was JSON (hopefully you designed web service that returns JSON!),
        // you might parse it like so:
        //
        // NSError *parseError;
        // id responseObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
        // if (!responseObject) {
        //     NSLog(@"JSON parse error: %@", parseError);
        // } else {
        //     NSLog(@"responseObject = %@", responseObject);
        // }
    
        // if response was text/html, you might convert it to a string like so:
        //
        // NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        // NSLog(@"responseString = %@", responseString);
    }];
    [task resume];
    
    Run Code Online (Sandbox Code Playgroud)

    哪里

    /** Build the body of a `application/x-www-form-urlencoded` request from a dictionary of keys and string values
    
     @param parameters The dictionary of parameters.
     @return The `application/x-www-form-urlencoded` body of the form `key1=value1&key2=value2`
     */
    - (NSData *)httpBodyForParameters:(NSDictionary *)parameters {
        NSMutableArray *parameterArray = [NSMutableArray array];
    
        [parameters enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *obj, BOOL *stop) {
            NSString *param = [NSString stringWithFormat:@"%@=%@", [self percentEscapeString:key], [self percentEscapeString:obj]];
            [parameterArray addObject:param];
        }];
    
        NSString *string = [parameterArray componentsJoinedByString:@"&"];
    
        return [string dataUsingEncoding:NSUTF8StringEncoding];
    }
    
    Run Code Online (Sandbox Code Playgroud)

    /** Percent escapes values to be added to a URL query as specified in RFC 3986.
    
     See http://www.ietf.org/rfc/rfc3986.txt
    
     @param string The string to be escaped.
     @return The escaped string.
     */
    - (NSString *)percentEscapeString:(NSString *)string {
        NSCharacterSet *allowed = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~"];
        return [string stringByAddingPercentEncodingWithAllowedCharacters:allowed];
    }
    
    Run Code Online (Sandbox Code Playgroud)