iOS-swift Alamofire网络请求框的使用

get请求

//获取当前时间
let now = Date()
//当前时间的时间戳
let timeInterval:TimeInterval = now.timeIntervalSince1970
let timeStamp = String(timeInterval)
let url = URL(string: "http://47.92.107.28:8000/static/banner.f?_=\(timeStamp)")!
//发起请求,返回Json数据格式的数据
Alamofire.request(url,method: .get,parameters: nil,encoding: URLEncoding.default,headers:nil).responseJSON { response
            in
            switch response.result.isSuccess {
            case true:
                if let value = response.result.value{
                    self.imgageData = []
                    //获取返回的值,转为json对象
                    let img_json = JSON(value)
                    //json转字符串
                    let json_str = img_json.rawString()
                    let zhu_url = "http://47.92.107.28:8000"
                    //遍历json数据
                    for(key,item) in img_json["imgs"] {
                        //print("src的值:\(item["src"])")
                        //如果取得的 src 的值为 String类型的话就添加到数组中
                        if let img_url = item["src"].string{
                            //将图片路径添加到数组中
                            self.imgageData.append(zhu_url+img_url)
                        }
                    }
                    //将数组转为字符串
                    let str = self.imgageData.joined()
                    //print("请求到返回的数据\(json_str)")                  
                }
            case false:
                print(response.result.error)
                UIAlertController.showAlert(message: "网络连接失败")
            }
        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Get请求、有参数、使用Basic Auth授权访问(例如:jira)

var header:HTTPHeaders = [:]
        if let authorizationHeader = Request.authorizationHeader(user: "xxxx", password: "xxxxxx") {
            header[authorizationHeader.key] = authorizationHeader.value
        }
        // 此处的 URLEncoding.default (URLEncoding.queryString )会将parameters 拼接到url后面
        Alamofire.request("https://httpbin.org/get", method: HTTPMethod.get, parameters: ["key":"value"], encoding: URLEncoding.default, headers: header).responseJSON { (response) in
            if(response.error == nil){
                LLog("请求成功")
                LLog(response.result.value)
            }else{
                LLog("请求失败\(String(describing: response.error))")
            }

        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST请求

Alamofire.request("https://httpbin.org/post", method: .post, parameters: ["key1":"value1","key2":"value2"], encoding: URLEncoding.default, headers: nil).responseJSON { (response) in

            if(response.error == nil){
                LLog("请求成功")
                LLog(response.result.value)
            }else{
                LLog("请求失败\(String(describing: response.error))")
            }

        }
1
2
3
4
5
6
7
8
9
10
post请求,提交json格式的数据

// JSONEncoding.default === JSONEncoding.prettyPrinted
    Alamofire.request("https://httpbin.org/post", method: .post, parameters: ["key1":"value1","key2":"value2"], encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in

            if(response.error == nil){
                LLog("请求成功")
                LLog(response.result.value)
            }else{
                LLog("请求失败\(String(describing: response.error))")
            }

        }
1
2
3
4
5
6
7
8
9
10
11
打开相册上传图片和视频

import UIKit
import AVFoundation
import MobileCoreServices
import AssetsLibrary
import AVKit
import Alamofire
import MediaPlayer

class ViewController: UIViewController,UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    //设置标志,用于标识上传那种类型文件(图片/视频)
    var flag = ""
    //设置服务器地址
    let uploadURL = "https://www.hellomiao.cn/hellomiao/upload.php"
    override func viewDidLoad() {
        super.viewDidLoad()


    }

    //按钮事件:上传图片
    @IBAction func uploadImage(_ sender: Any) {
        photoLib()
    }

    //按钮事件:上传视频
    @IBAction func uploadVideo(_ sender: Any) {
        videoLib()
    }

    //图库 - 照片
    func photoLib(){
        //
        flag = "图片"
        //判断设置是否支持图片库
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            //初始化图片控制器
            let picker = UIImagePickerController()
            //设置代理
            picker.delegate = self
            //指定图片控制器类型
            picker.sourceType = UIImagePickerControllerSourceType.photoLibrary
            //弹出控制器,显示界面
            self.present(picker, animated: true, completion: {
                () -> Void in
            })
        }else{
            print("读取相册错误")
        }
    }


    //图库 - 视频
    func videoLib(){
        flag = "视频"
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
            //初始化图片控制器
            let imagePicker = UIImagePickerController()
            //设置代理
            imagePicker.delegate = self
            //指定图片控制器类型
            imagePicker.sourceType = .photoLibrary;
            //只显示视频类型的文件
            imagePicker.mediaTypes =  [kUTTypeMovie as String]
            //不需要编辑
            imagePicker.allowsEditing = false
            //弹出控制器,显示界面
            self.present(imagePicker, animated: true, completion: nil)
        }
        else {
            print("读取相册错误")
        }
    }

    //选择成功后代理
    func imagePickerController(_ picker: UIImagePickerController,didFinishPickingMediaWithInfo info: [String : Any]) {
        if flag == "视频" {

            //获取选取的视频路径
            let videoURL = info[UIImagePickerControllerMediaURL] as! URL
            let pathString = videoURL.path
            print("视频地址:\(pathString)")
            //图片控制器退出
            self.dismiss(animated: true, completion: nil)
            let outpath = NSHomeDirectory() + "/Documents/\(Date().timeIntervalSince1970).mp4"
            //视频转码
            self.transformMoive(inputPath: pathString, outputPath: outpath)
        }else{
            //flag = "图片"

            //获取选取后的图片
            let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
            //转成jpg格式图片
            guard let jpegData = UIImageJPEGRepresentation(pickedImage, 0.5) else {
                return
            }
            //上传
            self.uploadImage(imageData: jpegData)
            //图片控制器退出
            self.dismiss(animated: true, completion:nil)
        }
    }

    //上传图片到服务器
    func uploadImage(imageData : Data){
        Alamofire.upload(
            multipartFormData: { multipartFormData in
                //采用post表单上传
                // 参数解释:
                //withName:和后台服务器的name要一致 ;fileName:可以充分利用写成用户的id,但是格式要写对; mimeType:规定的,要上传其他格式可以自行百度查一下
                multipartFormData.append(imageData, withName: "file", fileName: "123456.jpg", mimeType: "image/jpeg")
                //如果需要上传多个文件,就多添加几个
                //multipartFormData.append(imageData, withName: "file", fileName: "123456.jpg", mimeType: "image/jpeg")
                //......

        },to: uploadURL,encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                //连接服务器成功后,对json的处理
                upload.responseJSON { response in
                    //解包
                    guard let result = response.result.value else { return }
                    print("json:\(result)")
                }
                //获取上传进度
                upload.uploadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in
                    print("图片上传进度: \(progress.fractionCompleted)")
                }
            case .failure(let encodingError):
                //打印连接失败原因
                print(encodingError)
            }
        })
    }

    //上传视频到服务器
    func uploadVideo(mp4Path : URL){
        Alamofire.upload(
            //同样采用post表单上传
            multipartFormData: { multipartFormData in
                multipartFormData.append(mp4Path, withName: "file", fileName: "123456.mp4", mimeType: "video/mp4")
                //服务器地址
        },to: uploadURL,encodingCompletion: { encodingResult in
            switch encodingResult {
            case .success(let upload, _, _):
                //json处理
                upload.responseJSON { response in
                    //解包
                    guard let result = response.result.value else { return }
                    print("json:\(result)")
                }
                //上传进度
                upload.uploadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in
                    print("视频上传进度: \(progress.fractionCompleted)")
                }
            case .failure(let encodingError):
                print(encodingError)
            }
        })
    }

    /// 转换视频
    ///
    /// - Parameters:
    ///   - inputPath: 输入url
    ///   - outputPath:输出url
    func transformMoive(inputPath:String,outputPath:String){


        let avAsset:AVURLAsset = AVURLAsset(url: URL.init(fileURLWithPath: inputPath), options: nil)
        let assetTime = avAsset.duration

        let duration = CMTimeGetSeconds(assetTime)
        print("视频时长 \(duration)");
        let compatiblePresets = AVAssetExportSession.exportPresets(compatibleWith: avAsset)
        if compatiblePresets.contains(AVAssetExportPresetLowQuality) {
            let exportSession:AVAssetExportSession = AVAssetExportSession.init(asset: avAsset, presetName: AVAssetExportPresetMediumQuality)!
            let existBool = FileManager.default.fileExists(atPath: outputPath)
            if existBool {
            }
            exportSession.outputURL = URL.init(fileURLWithPath: outputPath)


            exportSession.outputFileType = AVFileTypeMPEG4
            exportSession.shouldOptimizeForNetworkUse = true;
            exportSession.exportAsynchronously(completionHandler: {

                switch exportSession.status{

                case .failed:

                    print("失败...\(String(describing: exportSession.error?.localizedDescription))")
                    break
                case .cancelled:
                    print("取消")
                    break;
                case .completed:
                    print("转码成功")
                    let mp4Path = URL.init(fileURLWithPath: outputPath)
                    self.uploadVideo(mp4Path: mp4Path)
                    break;
                default:
                    print("..")
                    break;
                }
            })
        }
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210


断点下载

import UIKit
import Alamofire

class ViewController: UIViewController {

    //停止下载按钮
    @IBOutlet weak var stopBtn: UIButton!
    //继续下载按钮
    @IBOutlet weak var continueBtn: UIButton!
    //下载进度条
    @IBOutlet weak var progress: UIProgressView!

    //下载文件的保存路径(
    var destination:DownloadRequest.DownloadFileDestination!
    //用于停止下载时,保存已下载的部分
    var cancelledData: Data?

    //下载请求对象
    var downloadRequest: DownloadRequest!

    override func viewDidLoad() {
        super.viewDidLoad()

        //设置下载路径。保存到用户文档目录,文件名不变,如果有同名文件则会覆盖
         self.destination = { _, response in
            let documentsURL = FileManager.default.urls(for: .documentDirectory,
                                                        in: .userDomainMask)[0]
            let fileURL = documentsURL.appendingPathComponent(response.suggestedFilename!)
            //两个参数表示如果有同名文件则会覆盖,如果路径中文件夹不存在则会自动创建
            return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
        }

        //页面加载完毕就自动开始下载
        self.downloadRequest =  Alamofire.download(
            "http://dldir1.qq.com/qqfile/qq/QQ7.9/16621/QQ7.9.exe", to: destination)
        self.downloadRequest.downloadProgress(queue: DispatchQueue.main,
                                              closure: downloadProgress) //下载进度
        self.downloadRequest.responseData(completionHandler: downloadResponse) //下载停止响应
    }

    //下载过程中改变进度条

    func downloadProgress(progress: Progress) {
        //进度条更新
        self.progress.setProgress(Float(progress.fractionCompleted), animated:true)
        print("当前进度:\(progress.fractionCompleted*100)%")
    }


    //下载停止响应(不管成功或者失败)
    func downloadResponse(response: DownloadResponse<Data>) {
        switch response.result {
        case .success(let data):
            //self.image = UIImage(data: data)
            print("文件下载完毕: \(response)")
        case .failure:
            self.cancelledData = response.resumeData //意外终止的话,把已下载的数据储存起来
        }
    }

    //停止按钮点击
    @IBAction func stopBtnClick(_ sender: AnyObject) {
        self.downloadRequest?.cancel()
        self.stopBtn.isEnabled = false
        self.continueBtn.isEnabled = true
    }

    //继续按钮点击
    @IBAction func continueBtnClick(_ sender: AnyObject) {
        if let cancelledData = self.cancelledData {
            self.downloadRequest = Alamofire.download(resumingWith: cancelledData,
                                                      to: destination)
            self.downloadRequest.downloadProgress(queue: DispatchQueue.main,
                                                  closure: downloadProgress) //下载进度
            self.downloadRequest.responseData(completionHandler: downloadResponse) //下载停止响应
            self.stopBtn.isEnabled = true
            self.continueBtn.isEnabled = false
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
详细参考
————————————————
版权声明:本文为CSDN博主「码农小白007」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wa172126691/article/details/80199132

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是几个iOS开源Swift代码的示例项目: 1. SwiftLint:一个用于在Swift项目中执行代码风格和规范检查的工具。它可以帮助开发者在编写代码时保持一致的风格和质量。 2. Alamofire:一个强大的网络请求库,用于在iOS应用程序中进行HTTP网络请求。它提供了简单易用的API,可以轻松处理网络请求和响应。 3. Kingfisher:一个用于在iOS应用程序中下载和缓存网络图片的库。它支持各种格式的图像,并具有高性能和简单的API。 4. SnapKit:一个用于在iOS应用程序中进行自动布局的库。它使用简单的链式语法,使得布局代码更加可读和易于维护。 5. RxSwift:一个用于在iOS应用程序中实现响应式编程的库。它提供了一套强大的工具和操作符,用于处理异步事件流和数据绑定。 6. SwiftyJSON:一个用于在Swift中解析和处理JSON数据的库。它使得解析和处理复杂的JSON数据结构变得简单和高效。 7. Moya:一个基于Alamofire网络抽象层,用于在iOS应用程序中进行网络请求。它提供了一种优雅的方式来定义和组织网络请求和响应。 8. Realm:一个用于在iOS应用程序中处理本地数据库的库。它提供了简单的API,可以轻松地进行数据存储和查询。 9. SwiftyUserDefaults:一个用于在Swift中简化UserDefaults的库。它提供了一套方便的API,可以轻松地读写和管理应用程序的用户设置和偏好。 10. SwiftDate:一个用于在Swift中处理日期和时间的库。它提供了一套简单而强大的API,可以轻松地进行日期计算、格式化和本地化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值