iOS:如何执行HTTP POST请求?

我正在接触iOS开发,我想有我的第一个应用程序执行HTTP POST请求。

据我所知,我应该通过一个NSURLConnection对象pipe理处理请求的连接,这强制我有一个委托对象,而这个委托对象又将处理数据事件。

有人可以请一个实际的例子来澄清这个任务吗?

我应该联系https端点发送authentication数据(用户名和密码),并获取一个纯文本响应。

你可以使用NSURLConnection如下:

  1. 设置你的requestWithURL:(NSURL *)theURL请求:使用requestWithURL:(NSURL *)theURL初始化请求。

    如果您需要指定POST请求和/或HTTP标头,请使用NSMutableURLRequest

    • (void)setHTTPMethod:(NSString *)method
    • (void)setHTTPBody:(NSData *)data
    • (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field
  2. 使用NSURLConnection以两种方式发送您的请求:

    • 同步: (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

      这将返回一个可以处理的NSDatavariables。

      重要提示:请记住在单独的线程中启动同步请求以避免阻塞UI。

    • asynchronous: (void)start

不要忘记设置NSURLConnection的委托来处理连接,如下所示:

 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [self.data setLength:0]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)d { [self.data appendData:d]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error", @"") message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"OK", @"") otherButtonTitles:nil] autorelease] show]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSString *responseText = [[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding]; // Do anything you want with it [responseText release]; } // Handle basic authentication challenge if needed - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { NSString *username = @"username"; NSString *password = @"password"; NSURLCredential *credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistenceForSession]; [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; } 

编辑:ASIHTTPRequest已被开发者放弃。 国际海事组织还是非常好的,但你现在应该去别的地方看看。

如果您正在处理HTTPS,我强烈推荐使用ASIHTTPRequest库 。 即使没有https,它也为这样的东西提供了一个非常好的包装,虽然在简单的http上做自己并不困难,但我认为这个库很好,是一个很好的开始。

在各种情况下,HTTPS并发症并不是微不足道的,如果你想在处理所有的变化方面变得强大,你会发现ASI库真正的帮助。

我想我会更新这个post,并说在ASIHTTPRequest被放弃之后,很多iOS社区已经转移到了AFNetworking 。 我强烈推荐它。 这是NSURLConnection的一个很好的包装,允许asynchronous调用,基本上你可能需要的任何东西。

这里是iOS7 +的更新的答案。 它使用NSURLSession,新的热点。 免责声明,这是未经testing,并写在一个文本字段:

 - (void)post { NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://example.com/dontposthere"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; // Uncomment the following two lines if you're using JSON like I imagine many people are (the person who is asking specified plain text) // [request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // [request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setHTTPMethod:@"POST"]; NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; }]; [postDataTask resume]; } -(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)( NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); } 

或者更好的是,使用AFNetworking 2.0+。 通常我会将子类AFHTTPSessionManager,但我把这一切都在一个方法有一个简洁的例子。

 - (void)post { AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"https://example.com"]]; // Many people will probably want [AFJSONRequestSerializer serializer]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // Many people will probably want [AFJSONResponseSerializer serializer]; manager.responseSerializer = [AFHTTPRequestSerializer serializer]; manager.securityPolicy.allowInvalidCertificates = NO; // Some servers require this to be YES, but default is NO. [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username" password:@"password"]; [[manager POST:@"dontposthere" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"darn it"); }] resume]; } 

如果您使用的是JSON响应序列化程序,responseObject将是JSON响应的对象(通常是NSDictionary或NSArray)。

注意:纯Swift 3(Xcode 8)示例:请尝试以下示例代码。 这是dataTask函数的简单例子。

 func simpleDataRequest() { //Get the url from url string let url:URL = URL(string: "YOUR URL STRING")! //Get the session instance let session = URLSession.shared //Create Mutable url request var request = URLRequest(url: url as URL) //Set the http method type request.httpMethod = "POST" //Set the cache policy request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringCacheData //Post parameter let paramString = "key=value" //Set the post param as the request body request.httpBody = paramString.data(using: String.Encoding.utf8) let task = session.dataTask(with: request as URLRequest) { (data, response, error) in guard let _:Data = data as Data?, let _:URLResponse = response , error == nil else { //Oops! Error occured. print("error") return } //Get the raw response string let dataString = String(data: data!, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) //Print the response print(dataString!) } //resume the task task.resume() } 

Xcode 8和Swift 3.0

使用URLSession:

  let url = URL(string:"Download URL")! let req = NSMutableURLRequest(url:url) let config = URLSessionConfiguration.default let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main) let task : URLSessionDownloadTask = session.downloadTask(with: req as URLRequest) task.resume() 

URLSession委托调用:

 func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) { print("downloaded \(100*writ/exp)" as AnyObject) } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){ } 

使用阻止GET / POST / PUT / DELETE:

  let request = NSMutableURLRequest(url: URL(string: "Your API URL here" ,param: param))!, cachePolicy: .useProtocolCachePolicy, timeoutInterval:"Your request timeout time in Seconds") request.httpMethod = "GET" request.allHTTPHeaderFields = headers as? [String : String] let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest) {data,response,error in let httpResponse = response as? HTTPURLResponse if (error != nil) { print(error) } else { print(httpResponse) } DispatchQueue.main.async { //Update your UI here } } dataTask.resume() 

为我工作好,试试100%的结果保证

以下是POST HTTP请求如何使用NSURLSession为iOS 8+工作:

 - (void)call_PostNetworkingAPI:(NSURL *)url withCompletionBlock:(void(^)(id object,NSError *error,NSURLResponse *response))completion { NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData; config.URLCache = nil; config.timeoutIntervalForRequest = 5.0f; config.timeoutIntervalForResource =10.0f; NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:nil delegateQueue:nil]; NSMutableURLRequest *Req=[NSMutableURLRequest requestWithURL:url]; [Req setHTTPMethod:@"POST"]; NSURLSessionDataTask *task = [session dataTaskWithRequest:Req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (error == nil) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; if (dict != nil) { completion(dict,error,response); } }else { completion(nil,error,response); } }]; [task resume]; } 

希望这将满足您的以下要求。