Swift使用Alamofire

Alamofire简介

AFNetworking 是 iOS 和 macOS 上最受欢迎的第三方库之一。它曾在我们的2012年的读者评选中荣获2012年度最佳 iOS 库称号。它同样也在 Github 上面获得了27000 多个 stars 和 8000 多个 forks,是使用最广的开源项目之一。

自2014年 Swift 推出之后,AFNetworking 的作者 Mattt Thompson 便提交了一个新的类似于 AFNetworking 的网络基础框架,并且是专门使用最新的 Swift 语言来编写的,其名为:Alamofire。AFNetwork 的前缀 AF 是 Alamofire 的缩写,因为这个新的框架名称是根据 Swift 的约定来进行命名的。

Alamofirea安装

本人是小白一枚,也是刚刚学习swift,所以安装过程不是使用的cocoapod,我是直接在GitHub把代码clone到本地,然后附加项目进行配置的。具体如下:

    将Alamofire代码clone或者下载到本地,加压之后将项目附加到自己项目中
    添加项目依赖

添加完成后,项目信息如下:

界面搭建

为了演示效果,简单的做了一个演示的界面,主要包含向后台请求json数据以及下载、上传文件功能,具体界面如下:

以下是创建页面的代码

  1. var label:UILabel!
  2. var imageView:UIImageView!
  3. var txtUserCode:UITextField!
  4. var txtUserName:UITextField!
  5. var btn : UIButton!
  6. let wWidth = UIScreen.main.bounds.size.width
  7. let hHeight = UIScreen.main.bounds.size.height
  8. var btnDownPic:UIButton!
  9. var btnUploadPic:UIButton!
  10. override func viewDidLoad() {
  11. super.viewDidLoad()
  12. //初始化Label
  13. label = UILabel(frame: CGRect(x: 20, y: 20, width: wWidth, height: 30))
  14. label.center.x = self.view.center.x
  15. label.adjustsFontSizeToFitWidth = true
  16. label.font = UIFont(name: "Arial", size: 14)
  17. label.lineBreakMode = .byTruncatingTail
  18. label.numberOfLines = 1
  19. label.text = "请输入用户编号"
  20. self.view.addSubview(label)
  21. //初始化UITextField
  22. txtUserCode = UITextField(frame: CGRect(x: 20, y: 50, width: wWidth-40, height: 30))
  23. txtUserCode.placeholder = "请输入用户编号"
  24. txtUserCode.allowsEditingTextAttributes = true
  25. txtUserCode.layer.cornerRadius = 3
  26. txtUserCode.borderStyle = .roundedRect
  27. txtUserCode.layer.borderWidth = 2
  28. txtUserCode.layer.borderColor = UIColor.black.cgColor
  29. self.view.addSubview(txtUserCode)
  30. txtUserName = UITextField(frame: CGRect(x: 20, y: 80, width: wWidth-40, height: 30))
  31. txtUserName.placeholder = ""
  32. txtUserName.allowsEditingTextAttributes = true
  33. txtUserName.layer.cornerRadius = 3
  34. txtUserName.borderStyle = .roundedRect
  35. txtUserName.layer.borderWidth = 2
  36. txtUserName.layer.borderColor = UIColor.black.cgColor
  37. self.view.addSubview(txtUserName)
  38. //初始化UIButton
  39. btn = UIButton(type: .system)
  40. btn.frame = CGRect(x: 20, y: 110, width: 100, height: 35)
  41. btn.setTitle("获取用户信息", for: .normal)
  42. btn.setTitle("正在获取", for: .highlighted)
  43. btn.addTarget(self, action:#selector(btnClick), for: .touchUpInside)
  44. self.view.addSubview(btn)
  45. //DownLoad picture
  46. btnDownPic = UIButton(type: .system)
  47. btnDownPic.frame = CGRect(x: 120, y: 110, width: 200, height: 35)
  48. btnDownPic.setTitle("DownLoadPic", for: .normal)
  49. btnDownPic.setTitle("正在获取", for: .highlighted)
  50. btnDownPic.addTarget(self, action:#selector(AlamofireDownLoad), for: .touchUpInside)
  51. self.view.addSubview(btnDownPic)
  52. //Upload Picture
  53. btnUploadPic = UIButton(type: .system)
  54. btnUploadPic.frame = CGRect(x: 220, y: 110, width: 200, height: 35)
  55. btnUploadPic.setTitle("UpLoadPic", for: .normal)
  56. btnUploadPic.setTitle("正在上传", for: .highlighted)
  57. btnUploadPic.addTarget(self, action:#selector(AlamofireUpLoad), for: .touchUpInside)
  58. self.view.addSubview(btnUploadPic)
  59. //初始化UIImageView
  60. imageView = UIImageView(frame: CGRect(x: 20, y: 140, width: 440, height: 275))
  61. self.view.addSubview(imageView)
  62. // Do any additional setup after loading the view, typically from a nib.
  63. }

后台代码

由于小编是搞.Net的,所以就写了个一般处理程序(ashx),作为简单的演示,具体代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using CYQ.Data;
  6. using Swift.Entity;
  7. using Newtonsoft.Json;
  8. using System.Text;
  9. namespace Swift.Web.Handler
  10. {
  11. /// <summary>
  12. /// ajaxHandler 的摘要说明
  13. /// </summary>
  14. public class ajaxHandler : IHttpHandler
  15. {
  16. public void ProcessRequest(HttpContext context)
  17. {
  18. context.Response.ContentType = "text/plain";
  19. context.Response.ContentEncoding = Encoding.UTF8;
  20. //context.Response.Write("Hello World");
  21. if (context.Request.Params.AllKeys.Contains("upload"))
  22. {
  23. ProcessUpload(context);
  24. }
  25. else
  26. {
  27. var userCode = context.Request.Params["UserCode"];
  28. List<T_User> lstUsers = new List<T_User>();
  29. using (T_User user = new T_User())
  30. {
  31. lstUsers = user.Select<T_User>("Code = ‘" + userCode + "‘").ToList();
  32. }
  33. context.Response.Write(JsonConvert.SerializeObject(lstUsers));
  34. }
  35. }
  36. public void ProcessUpload(HttpContext context)
  37. {
  38. var data = context.Request.Form["beauty"];
  39. string str = string.Empty;
  40. }
  41. public bool IsReusable
  42. {
  43. get
  44. {
  45. return false;
  46. }
  47. }
  48. }
  49. }

请求后台数据

这里我使用用户编号获取用户姓名,往后台传递用户编号,后台返回一个序列化的json字符串,方法使用的responseString,类似的还有responseJSON、response等

  1. @objc func btnClick(){
  2. if(self.txtUserCode.text!.isEmpty){
  3. let alertControl = UIAlertController(title: "提示", message: "请输入用户编号", preferredStyle: .alert)
  4. let alertAction = UIAlertAction(title: "确定", style: .default, handler: nil)
  5. alertControl.addAction(alertAction)
  6. self.present(alertControl, animated: true, completion: {
  7. })
  8. return
  9. }
  10. let para:[String:Any] = ["UserCode":self.txtUserCode.text!]
  11. let url:String = "http://114.115.214.130/Handler/ajaxHandler.ashx"
  12. Alamofire.request(url, method: .post, parameters: para, encoding: URLEncoding.default, headers: nil).responseString { (response) in
  13. if(response.result.isSuccess){
  14. let str = response.result.value
  15. let data = str?.data(using: .utf8)
  16. let jsonResult = try? JSON(data: data!, options: JSONSerialization.ReadingOptions.allowFragments)
  17. let userName = jsonResult![0]["Name"].string
  18. self.txtUserName.text = userName
  19. }else{
  20. self.txtUserName.text = "获取数据失败"
  21. }
  22. }
  23. }

下载文件

下载图片的URL必须遵循文件协议,即以file://开头

  1. //下载图片
  2. @objc func AlamofireDownLoad(){
  3. let imageUrl = "http://114.115.214.130/images/1.jpg"
  4. Alamofire.download(imageUrl) { (url, response) -> (destinationURL: URL, options: DownloadRequest.DownloadOptions) in
  5. let fileUrl = "file:///" + NSHomeDirectory() + "/Documents/1.jpg"
  6. let options = DownloadRequest.DownloadOptions.removePreviousFile
  7. return(URL(string: fileUrl)!,options)
  8. }.downloadProgress { (progress) in
  9. }.response { (response1) in
  10. if response1.error == nil{
  11. self.imageView.image = UIImage(named: NSHomeDirectory() + "/Documents/1.jpg")
  12. }else{
  13. print(response1.error)
  14. }
  15. }
  16. }

上传文件

  1. @objc func AlamofireUpLoad(){
  2. let urlUpload = "http://192.168.2.101/Handler/ajaxHandler.ashx"
  3. let headers = ["content-type":"multipart/form-data"]
  4. Alamofire.upload(multipartFormData: { (multidata) in
  5. multidata.append("lisen".data(using: String.Encoding.utf8)!, withName: "upload")
  6. let image = #imageLiteral(resourceName: "timg.jpeg")
  7. multidata.append(UIImageJPEGRepresentation(image, 1.00)!, withName: "beauty", mimeType: "mage/*")
  8. }, to: URL(string: urlUpload)!) { (result) in
  9. switch result{
  10. case .success(let upload, streamingFromDisk: _, streamFileURL: _):
  11. upload.response(completionHandler: { (response) in
  12. if(response.error == nil){
  13. print("upload success")
  14. }else{
  15. print(response.error)
  16. }
  17. })
  18. case .failure(let encodingError):
  19. print(encodingError.localizedDescription)
  20. }
  21. }
  22. }

本文地址:https://www.lisen.me/263.html
版权声明:本文为原创文章,版权归 李森的博客 所有,欢迎分享本文,转载请保留出处!

时间: 2025-01-04 11:13:38

Swift使用Alamofire的相关文章

[Swift]使用Alamofire传递参数时报错

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 } span.s1 { } span.s2 { font: 11.0px "PingFang SC" } Swift使用Alamofire传递递参数时报错,会提示超时,主要错误信息如下: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 }

iOS开发——网络编程Swift篇&amp;Alamofire详解

Alamofire详解 预览图 Swift Alamofire 简介 Alamofire是 Swift 语言的 HTTP 网络开发工具包,相当于Swift实现AFNetworking版本. 当然,AFNetworking非常稳定,在Mac OSX与iOS中也能像其他Objective-C代码一样用Swift编写.不过Alamofire更适合Swift语言风格习惯(Alamofire与AFNetworking可以共存一个项目中,互不影响). Alamofire 取名来源于Alamo Fire fl

Swift使用Alamofire实现网络请求

Alamofire是一个用Swift编写的HTTP网络库,由此前热门开源项目AFNetworking的的作者mattt开发,可非常简单地用于异步网络通信. 要获取最新版本的 Alamofire,前往https://github.com/Alamofire/Alamofire然后单击网页右边的Download ZIP按钮.接着在 Finder 中打开起始项目文件夹,,然后将Alamofire-master文件夹拖入到您的主项目文件夹中. 打开Alamofire-master文件夹(现在它位于您的项

Swift 集成Alamofire/Kingfisher/MJRefresh/MBProgressHUD的小项目

前些时做的Swift版本的瀑布流的Demo<Swift UITableView瀑布流/NSURLConnection异步网络请求>时,使用的是NSURLConnection做的网络异步请求,图片的异步加载使用的是GCD做的.在使用的过程中,网络请求部分是没有什么问题的,但是在图片的异步加载时,由于图片没有缓存,所以在上下滑动的时候,需要不断的加载图片,所以用户体验不好. 在OC中,我们有AFNetworking和SDWebimage做网络的加载和图片的加载.那么在Swift中也是有类似的:Al

Swift: 用Alamofire做http请求,用ObjectMapper解析JSON

演示样例代码看最后. 跟不上时代的人突然间走在了时代的前列,果然有别样的风景.首先歧视一下AFNetworking.这个东西实在太难用了.不想封装都不行,要不写一大堆代码. NSURL *URL = [NSURL URLWithString:@"http://example.com/resources/123.json"]; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:URL.

NSURLSession用法示例及断点续传视频的实现

NSURLSession是苹果在WWDC2013中提出来的,旨在替代NSURLConnection,与我们之前经常使用的NSURLConnection不同,NSURLSession为我们提供了更灵活的使用方法,包括后台下载以及断点续传的实现等功能.之前使用下载一直用的都是第三方框架比如OC的AFNetworking或者Swift的Alamofire.虽然第三方库用起来很方便也很稳定,但是还是想自己研究下苹果原生的下载框架.这几天研究了下NSURLSession,做了一个加载视频的demo,包括了

AFNetworking 官方文档

AFNetworking Version Minimum iOS Target Minimum OS X Target Notes 2.x iOS 6 OS X 10.8 Xcode 5 is required. AFHTTPSessionManagerrequires iOS 7 or OS X 10.9. 1.x iOS 5 Mac OS X 10.7   0.10.x iOS 4 Mac OS X 10.6   (OS X projects must support 64-bit with

Swift - 从字典(或者Alamofire)直接创建Model文件的工具

效果 1. 常规生成model的方式 2. 通过debug创建model的方式 特性 1. 可以处理JSON格式的字典数据 2. 可以处理本地的json数据 3. 可以处理Alamofire生成的json格式返回数据 4. 生成的Models继承自NSObject,所有方法均系系统方法,没有任何接口污染,后续升级不存在版本兼容问题(以下是一个生成的Model的示例) // // AlamofireModel.swift // // http://www.cnblogs.com/YouXianMi

Swift&amp;NodeJS 使用Alamofire进行Post(zhuan)

这篇博客主要实现Swift客户端和NodeJS后台的Post.Get请求实现. 我是一个略有点讨厌重复使用工具的人,比如这些基本功能完全可以用OC和PHP等替代,但是没办法,现在知识更新的太快啦,Swift和NodeJS这么热,不去看看还会跟不上时代,里面一些特性也是让人大开眼界. 下面就来说说实现吧. Swift客户端: Swift中的原生HTTP请求方式有(和OC中一样) 1.NSURLConnection的sendSynchronousRequest方法(自iOS9.0起被废除) 2. N