post网络请求,支持多层字典参数

支持多层字典参数,原型是参考别人的,再进行了多层字典参数的判断
/// post 普通参数
+ (void)postAsynWithURL:(NSURL*)aURL parems:(NSDictionary *)postParems compile:(void(^)(id response, NSData *data, NSError *error))block;
</pre><pre name="code" class="objc">
/// post data、imageData ;imageContentType 填写为image/png、image/webp、image/*之类的,或者不填;imageName 填服务器的image对应的参数名
+ (void)postImageAsynwithURL:(NSURL *)aUrl parems:(NSDictionary *)postKeys withImageData:(NSData *)data ImageName:(NSString *)name ImageContentType:(NSString *)imageContentType compile:(void(^)(id response, NSData *data, NSError *error))block;







+ (void)postAsynWithURL:(NSURL*)aURL parems:(NSDictionary *)postParems compile:(void(^)(id response, NSData *data, NSError *error))block{

    NSString * parameterStr = @"";

    for (NSString * key  in postParems) {

        NSString * content = postParems[key];

        if ([content isKindOfClass:[NSDictionary class]] || [content isKindOfClass:[NSArray class]]) {

            NSData * data = [NSJSONSerialization dataWithJSONObject:content options:0 error:nil];

            content = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

        }

  //      if (content.length > 0) {

            parameterStr = [NSString stringWithFormat:@"%@&%@=%@",parameterStr,key,content];

  //      }

    }

    if ([parameterStr hasPrefix:@"&"]) {

        parameterStr = [parameterStr substringFromIndex:1];

    }

    NSData * postData = [parameterStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

    NSString *postLength = [NSString stringWithFormat:@"%@",@([postData length])];

//    NSLog(@"url_parameterStr : %@",parameterStr);

    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:aURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];

    [request setHTTPMethod:@"POST"];

    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];

    [request setHTTPBody:postData];

    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        if (!connectionError) {

            id resultDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&connectionError];

            block(resultDic,data,connectionError);

        }else{

            block(nil,data,connectionError);

        }

    }];

}
</pre><pre name="code" class="objc">
+ (void)postImageAsynwithURL:(NSURL *)aUrl parems:(NSDictionary *)postKeys withImageData:(NSData *)data ImageName:(NSString *)name ImageContentType:(NSString *)imageContentType compile:(void(^)(id response, NSData *data, NSError *error))block{

    if (imageContentType.length < 1) {

        imageContentType = @"application/octet-stream";

    }

    //Add the header info

    NSString *stringBoundary = @"0xKhTmLbOuNdArY";

    //create the body

    NSMutableData *postBody = [NSMutableData data];

    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

    //add key values from the NSDictionary object

    NSEnumerator *keys = [postKeys keyEnumerator];

    for (NSInteger i = 0; i < [postKeys count]; i++) {

        NSString *tempKey = [keys nextObject];

        [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",tempKey] dataUsingEncoding:NSUTF8StringEncoding]];

        NSString * content = [postKeys objectForKey:tempKey];

        

        if ([content isKindOfClass:[NSDictionary class]] || [content isKindOfClass:[NSArray class]]) {

            NSData * data = [NSJSONSerialization dataWithJSONObject:content options:0 error:nil];

            content = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

        }

        

        [postBody appendData:[[NSString stringWithFormat:@"%@",content] dataUsingEncoding:NSUTF8StringEncoding]];

        [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

    }

    //add data field and file data

    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"imageName.png\"\r\n",name] dataUsingEncoding:NSUTF8StringEncoding]];

    [postBody appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n",imageContentType] dataUsingEncoding:NSUTF8StringEncoding]];

    [postBody appendData:[NSData dataWithData:data]];

    [postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

    

    

    NSString *postLength = [NSString stringWithFormat:@"%@",@([postBody length])];

    NSMutableURLRequest *tumblrPost = [[NSMutableURLRequest alloc]initWithURL:aUrl cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];

    [tumblrPost setHTTPMethod:@"POST"];

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];

    [tumblrPost addValue:contentType forHTTPHeaderField: @"Content-Type"];

    //add the body to the post

    [tumblrPost setHTTPBody:postBody];

    [tumblrPost setValue:postLength forHTTPHeaderField:@"Content-Length"];



    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    [NSURLConnection sendAsynchronousRequest:tumblrPost queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        if (!connectionError) {

            id resultDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&connectionError];

            block(resultDic,data,connectionError);

        }else{

            block(nil,data,connectionError);

        }

    }];

}

猜你喜欢

转载自blog.csdn.net/gdutxzy/article/details/49366665
今日推荐