【问题标题】:AFNetworking Post RequestAFNetworking 发布请求
【发布时间】:2011-11-29 05:05:10
【问题描述】:

我是 obj-c 的新手,在我的一些项目中一直使用 asihttp。在 asihttp 中执行发布请求时,它会以这种方式完成。

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:height forKey:@"user[height]"];
    [request setPostValue:weight forKey:@"user[weight]"];
    [request setDelegate:self];
    [request startAsynchronous];

AFNetworking 将如何通过代码示例执行此操作?
我已经让 get Json getrequest 在 AFNetworking 中工作,但是这个帖子请求给我带来了一些问题。提前感谢您的帮助。

【问题讨论】:

    标签: ios objective-c afnetworking afnetworking-2


    【解决方案1】:

    首先值得补充的是(因为这个答案在我最初写它 6 年后仍然很流行......)你应该考虑的第一件事是你是否应该使用 AFNetworking。 NSURLSession 是在 iOS 7 中添加的,这意味着您在许多情况下不需要使用 AFNetworking - 并且少一个第三方库总是一件好事。

    对于 AFNetworking 3.0:

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    NSDictionary *params = @{@"user[height]": height,
                             @"user[weight]": weight};
    [manager POST:@"https://example.com/myobject" parameters:params progress:nil success:^(NSURLSessionTask *task, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(NSURLSessionTask *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    

    对于 AFNetworking 2.0(也使用新的 NSDictionary 语法):

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSDictionary *params = @{@"user[height]": height,
                             @"user[weight]": weight};
    [manager POST:@"https://example.com/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    

    如果您在使用 AFNetworking 1.0 时遇到问题,您需要这样做:

    NSURL *url = [NSURL URLWithString:@"https://example.com/"];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                            height, @"user[height]",
                            weight, @"user[weight]",
                            nil];
    [httpClient postPath:@"/myobject" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"Request Successful, response '%@'", responseStr);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"[HTTPClient Error]: %@", error.localizedDescription);
    }];
    

    【讨论】:

    • 非常感谢约瑟夫,它工作得很好。在我分配 httpClient 后我有一个问题,我在创建请求后释放它,我似乎没有任何崩溃并且似乎运行良好。我只是想确认这是发布它的正确位置。再一次非常感谢你。亲切的问候
    • 是的,这行得通。如果您发出另一个请求,AFHTTPClient 确实打算保留并再次使用,但在“requestWithMethod:”调用之后直接释放它是可以接受的。
    • 嗨 Joseph,我终于用 json 响应解决了问题,我设置了另一个问题 stackoverflow.com/questions/7630289/… 来真正了解我是否做得对。非常感谢打扰。
    • 到目前为止,AFHTTPRequestOperation 似乎没有更多的“operationWithRequest:completion”方法......只需使用“initWithRequest”,然后使用“setCompletionBlockWithSuccess”。
    • @Rakesh 在 cmets 中很难正确回答这样的问题 - 我可以建议您打开一个新问题吗?
    【解决方案2】:
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                           height, @"user[height]",
                           weight, @"user[weight]",
                           nil];
    
    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:
                                                 [NSURL URLWithString:@"http://localhost:8080/"]];
    
    [client postPath:@"/mypage.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
         NSString *text = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
         NSLog(@"Response: %@", text);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"%@", [error localizedDescription]);
    }];
    

    【讨论】:

      【解决方案3】:

      这是我正在使用的一个简单的 AFNetworking POST。起床并运行后 阅读 AFNetworking doc、wikiki、ref 等,我学到了很多 关注http://nsscreencast.com/episodes/6-afnetworking并理解 github上的相关代码示例。

       // Add this to the class you're working with - (id)init {}
          _netInst = [MyApiClient sharedAFNetworkInstance];
      
        // build the dictionary that AFNetworkng converts to a json object on the next line
        //  params = {"user":{"email":emailAddress,"password":password}};
        NSDictionary *parameters =[NSDictionary dictionaryWithObjectsAndKeys:
                                   userName, @"email", password, @"password", nil];
        NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys:
                               parameters, @"user", nil];
      
         [_netInst postPath: @"users/login.json" parameters:params
            success:^(AFHTTPRequestOperation *operation, id jsonResponse) {
              NSLog (@"SUCCESS");
      
              // jsonResponse = {"user":{"accessId":1234,"securityKey":"abc123"}};
              _accessId = [jsonResponse valueForKeyPath:@"user.accessid"];
              _securityKey = [jsonResponse valueForKeyPath:@"user.securitykey"];
      
              return SUCCESS;
            }
            failure:^(AFHTTPRequestOperation *operation, NSError *error) {
              NSLog(@"FAILED");
      
              // handle failure
      
              return error;
            }
         ];  
      

      【讨论】:

      • responseObject是否自动解析成JSON?
      【解决方案4】:
          AFHTTPClient * Client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://urlname"]];
          NSDictionary * parameters = [[NSMutableDictionary alloc] init];
          parameters = [NSDictionary dictionaryWithObjectsAndKeys:
                       height, @"user[height]",
                              weight, @"user[weight]",
                        nil]; 
      
          [Client setParameterEncoding:AFJSONParameterEncoding];
          [Client postPath:@"users/login.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
          NSLog(@"operation hasAcceptableStatusCode: %d", [operation.response statusCode]);
      
          NSLog(@"response string: %@ ", operation.responseString);
      
          NSDictionary *jsonResponseDict = [operation.responseString JSONValue];
              if ([[jsonResponseDict objectForKey:@"responseBody"] isKindOfClass:[NSMutableDictionary class]]) {
                  NSMutableDictionary *responseBody =  [jsonResponseDict objectForKey:@"responseBody"];
                 //get the response here
      
      
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      
              NSLog(@"error: %@", operation.responseString);
              NSLog(@"%d",operation.response.statusCode);
      
          }];
      

      希望这行得通。

      【讨论】:

        【解决方案5】:

        对于 AFNetworking 4

        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
        NSDictionary *params = @{@"user[height]": height,
                                 @"user[weight]": weight};
        [manager POST:@"https://example.com/myobject" parameters:params headers:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {
            NSLog(@"JSON: %@", responseObject);
        } failure:^(NSURLSessionTask *operation, NSError *error) {
            NSLog(@"Error: %@", error);
        }];
        

        【讨论】:

          【解决方案6】:

          这里是 Swift 3.0

          的示例
          let manager = AFHTTPSessionManager(sessionConfiguration: URLSessionConfiguration.default)
          manager.requestSerializer = AFJSONRequestSerializer()
          manager.requestSerializer.setValue("application/json", forHTTPHeaderField: "Content-Type")
          manager.requestSerializer.setValue("application/json", forHTTPHeaderField: "Accept")
          
          if authenticated {
              if let user = UserDAO.currentUser() {
                  manager.requestSerializer.setValue("Authorization", forHTTPHeaderField: user.headerForAuthentication())
              }
          }
          
          manager.post(url, parameters: parameters, progress: nil, success: { (task: URLSessionDataTask, responseObject: Any?) in 
              if var jsonResponse = responseObject as? [String: AnyObject] {
                  // here read response
              }
          }) { (task: URLSessionDataTask?, error: Error) in
              print("POST fails with error \(error)")
          }
          

          【讨论】:

            【解决方案7】:
            [SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeGradient];
            [SVProgressHUD show];
            
            NSDictionary *dictParam =@{@"user_id":@"31"};// Add perameter
            
            NSString *URLString =@"your url string";
            
            AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
            [manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
            [manager.requestSerializer setValue:strGlobalLoginToken forHTTPHeaderField:@"Authorization"];//strGlobalLoginToken is your login token
            //         [manager.requestSerializer setValue:setHeaderEnv forHTTPHeaderField:@"Env"];
            manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",@"application/rss+xml", nil];
            [manager POST:URLString parameters:dictParam progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
             {
            
                 NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
            
                 NSLog(@"Response DICT:%@",response);
            
                 if ([[[[response objectForKey:@"response"] objectAtIndex:0] objectForKey:@"status"] isEqualToString:@"true"])
                 {
            
                     for (NSMutableDictionary *dicAll in [[[response objectForKey:@"response"]objectAtIndex:0]objectForKey:@"plans"])
                     {
                         [yourNsmutableArray addObject:[dicAll mutableCopy]];
                     }
                     //yourNsmutableArray Nsmutablearray  alloction in view didload
            
                     NSLog(@"yourNsmutableArray  %@",yourNsmutableArray);
                 }
                 else
                 {
                     NSLog(@"False");
                 }
            
                 [SVProgressHUD dismiss];
            
             } failure:^(NSURLSessionDataTask  *_Nullable task, NSError  *_Nonnull error)
             {
                 NSLog(@"RESPONSE STRING:%@",task.response);
                 NSLog(@"error userInfo:%@",error.userInfo);
            
                 NSString *errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];
                 NSLog(@"URLString :--->>   %@ Error********* %@",URLString,errResponse);
            
                 [SVProgressHUD dismiss];
            
             }];
            

            【讨论】:

              【解决方案8】:

              适用于 AFNetworking 3.0 和 Swift。也许我们可以这样使用:

              let configutation = NSURLSessionConfiguration.defaultSessionConfiguration()
              manager = AFHTTPSessionManager(sessionConfiguration: configutation)
              
              let urlString = "url"
              manager.POST(urlString, parameters: [params here], progress: nil, success: { (dataTask: NSURLSessionDataTask, response: AnyObject?) -> Void in
                      print(dataTask)
                      print(response)
                      }) { (dataTask: NSURLSessionDataTask?, error: NSError) -> Void in
                      print(error)
              }
              

              希望这会帮助其他人像我一样找到答案!

              【讨论】:

                【解决方案9】:

                对于 AFNetworking 3.0iOS9 或更高版本

                 NSString *strURL = @"https://exampleWeb.com/webserviceOBJ";
                    NSDictionary *dictParamiters = @{@"user[height]": height,@"user[weight]": weight};
                
                    NSString *aStrParams = [self getFormDataStringWithDictParams:dictParamiters];
                
                    NSData *aData = [aStrParams dataUsingEncoding:NSUTF8StringEncoding];
                
                    NSMutableURLRequest *aRequest = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:strURL]];
                    [aRequest setHTTPMethod:@"POST"];
                    [aRequest setHTTPBody:aData];
                
                    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
                    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];
                    [aRequest setHTTPBody:aData];
                
                    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:aRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                        //
                        if (error ==nil) {
                            NSString *aStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
                            NSLog(@"ResponseString:%@",aStr);
                            NSMutableDictionary *aMutDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                            dispatch_async(dispatch_get_main_queue(), ^{
                                    completionBlock(aMutDict);
                
                                NSLog(@"responce:%@",aMutDict)
                
                            });
                        }
                        else
                        {
                            dispatch_async(dispatch_get_main_queue(), ^{
                                NSLog(@"error:%@",error.locali)
                            });
                        }
                    }];
                
                    [postDataTask resume];
                

                并添加

                -(NSString *)getFormDataStringWithDictParams:(NSDictionary *)aDict
                {
                    NSMutableString *aMutStr = [[NSMutableString alloc]initWithString:@""];
                    for (NSString *aKey in aDict.allKeys) {
                        [aMutStr appendFormat:@"%@=%@&",aKey,aDict[aKey]];
                    }
                    NSString *aStrParam;
                    if (aMutStr.length>2) {
                        aStrParam = [aMutStr substringWithRange:NSMakeRange(0, aMutStr.length-1)];
                
                    }
                    else
                        aStrParam = @"";
                
                    return aStrParam;
                }
                

                【讨论】:

                • 该代码根本不使用 AFNetworking。这只是一个如何使用 NSURLSession 的示例。
                【解决方案10】:
                NSURL *URL = [NSURL URLWithString:@"url"];
                
                
                AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
                NSDictionary *params = @{@"prefix":@"param",@"prefix":@"param",@"prefix":@"param"};
                [manager POST:URL.absoluteString parameters:params progress:nil success:^(NSURLSessionTask *task, id responseObject) {
                    self.arrayFromPost = [responseObject objectForKey:@"data"];
                    // values in foreach loop
                
                
                    NSLog(@"POst send: %@",_arrayFromPost);
                } failure:^(NSURLSessionTask *operation, NSError *error) {
                
                
                    NSLog(@"Error: %@", error);
                }];
                

                【讨论】:

                  【解决方案11】:
                  NSMutableDictionary *dictParam = [NSMutableDictionary dictionary];
                  [dictParam setValue:@"VALUE_NAME" forKey:@"KEY_NAME"]; //set parameters like id, name, date, product_name etc
                  
                  if ([[AppDelegate instance] checkInternetConnection]) {
                      NSError *error;
                      NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictParam options:NSJSONWritingPrettyPrinted error:&error];                                             
                  
                      if (jsonData) {
                          NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"Api Url"]
                                                                                 cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                                             timeoutInterval:30.0f];
                          [request setHTTPMethod:@"POST"];
                  
                          [request setHTTPBody:jsonData];
                          [request setValue:ACCESS_TOKEN forHTTPHeaderField:@"TOKEN"];
                  
                          AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
                          op.responseSerializer = [AFJSONResponseSerializer serializer];
                          op.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"text/html",@"application/json", nil];
                  
                          [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
                           arrayList = [responseObject valueForKey:@"data"];
                           [_tblView reloadData];
                           } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                           //show failure alert
                           }];
                          [op start];
                      }
                  } else {
                      [UIAlertView infoAlertWithMessage:NO_INTERNET_AVAIL andTitle:APP_NAME];
                  }
                  

                  【讨论】:

                    【解决方案12】:
                    please try below answer.
                    
                    +(void)callAFWSPost:(NSDictionary *)dict withURL:(NSString *)strUrl 
                    withBlock:(dictionary)block
                    {
                    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
                    [manager.requestSerializer setValue:@"application/x-www-form-urlencoded; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
                    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
                    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil];
                    [manager POST:[NSString stringWithFormat:@"%@/%@",WebserviceUrl,strUrl] parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
                     {
                         if (!responseObject)
                         {
                             NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                             [dict setObject:ServerResponceError forKey:@"error"];
                             block(responseObject);
                             return ;
                         }
                         else if ([responseObject isKindOfClass:[NSDictionary class]]) {
                             block(responseObject);
                             return ;
                         }
                     }
                          failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
                     {
                         NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                         [dict setObject:ServerResponceError forKey:@"error"];
                         block(dict);
                     }];
                    }
                    

                    【讨论】:

                      【解决方案13】:

                      用于登录屏幕;

                      NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                      dict = [NSMutableDictionary 
                      
                      dictionaryWithObjectsAndKeys:_usernametf.text, @"username",_passwordtf.text, @"password", nil];
                          AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
                          manager.requestSerializer = [AFHTTPRequestSerializer serializer];
                      
                      [manager POST:@"enter your url" parameters:dict progress:nil success:^(NSURLSessionTask *task, id responseObject) {
                          NSLog(@"%@", responseObject);
                      
                      }
                            failure:^(NSURLSessionTask *operation, NSError *error) {
                                NSLog(@"Error: %@", error);
                            }];
                      

                      }

                      【讨论】:

                        【解决方案14】:
                        // For Image with parameter /// AFMultipartFormData
                        
                        NSDictionary *dictParam =@{@"user_id":strGlobalUserId,@"name":[dictParameter objectForKey:@"Name"],@"contact":[dictParameter objectForKey:@"Contact Number"]};
                        
                        AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:webServiceUrl]];
                        [manager.requestSerializer setValue:strGlobalLoginToken forHTTPHeaderField:@"Authorization"];
                        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",@"application/rss+xml", nil];
                        [manager POST:@"update_profile" parameters:dictParam constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
                            if (Imagedata.length>0) {
                                [formData appendPartWithFileData:Imagedata name:@"profile_pic" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
                            }
                        } progress:nil
                              success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
                         {
                             NSLog(@"update_profile %@", responseObject);
                        
                             if ([[[[responseObject objectForKey:@"response"] objectAtIndex:0] objectForKey:@"status"] isEqualToString:@"true"])
                             {
                                 [self presentViewController:[global SimpleAlertviewcontroller:@"" Body:[[[responseObject objectForKey:@"response"] objectAtIndex:0] objectForKey:@"response_msg"] handler:^(UIAlertAction *action) {
                                     [self.navigationController popViewControllerAnimated:YES];
                        
                                 }] animated:YES completion:nil];
                        
                        
                             }
                             else
                             {
                                 [self presentViewController:[global SimpleAlertviewcontroller:@"" Body:[[[responseObject objectForKey:@"response"] objectAtIndex:0] objectForKey:@"response_msg"] handler:^(UIAlertAction *action) {
                                 }] animated:YES completion:nil];
                        
                             }
                             [SVProgressHUD dismiss];
                        
                         } failure:^(NSURLSessionDataTask  *_Nullable task, NSError  *_Nonnull error)
                         {
                             [SVProgressHUD dismiss];
                         }];
                        

                        【讨论】:

                          【解决方案15】:

                          使用 AFNetworking 3.0,你应该这样写:

                          NSString *strURL = @"https://exampleWeb.com/webserviceOBJ";
                          NSURL * urlStr = [NSURL URLWithString:strURL];
                          
                          NSDictionary *dictParameters = @{@"user[height]": height,@"user[weight]": weight};
                          
                          AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
                          
                          
                          [manager POST:url.absoluteString parameters:dictParameters success:^(NSURLSessionTask *task, id responseObject) {
                              NSLog(@"PLIST: %@", responseObject);
                             
                          } failure:^(NSURLSessionTask *operation, NSError *error) {
                              NSLog(@"Error: %@", error);
                              
                          }];
                          

                          【讨论】:

                          • 这看起来不错,但我认为 OP 正在寻找如何发送 POST 请求。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-03-22
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多