博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Alamofire4.x开源代码分析(二)请求参数和编码
阅读量:7042 次
发布时间:2019-06-28

本文共 4681 字,大约阅读时间需要 15 分钟。

hot3.png

请求方法

框架提供了9种方法

case options = "OPTIONS"    case get     = "GET"    case head    = "HEAD"    case post    = "POST"    case put     = "PUT"    case patch   = "PATCH"    case delete  = "DELETE"    case trace   = "TRACE"    case connect = "CONNECT"    Alamofire.request("https://httpbin.org/post", method: .post)

如果不指定默认使用GET方法

参数编码

Alamofire提供了三种类型的参数编码:URL, JSON 和 PropertyList.也可以遵守ParameterEncoding协议来自定义.

<!--more-->

URL编码

  • .methodDependent//默认方法 根据请求方法判断(GET直接拼接到URL中,HEAD and DELETE放到HTTP body中)
  • .queryString//直接拼接到URL中
  • .httpBody//放到HTTP body中
GET请求
//  以下三个写法等价Alamofire.request("https://httpbin.org/get", parameters: parameters) // encoding defaults to `URLEncoding.default`Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default)Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding(destination: .methodDependent))// https://httpbin.org/get?foo=bar
POST请求
"foo": "bar",    "baz": ["a", 1],    "qux": [        "x": 1,        "y": 2,        "z": 3    ]]// 以下三个写法等价Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters)Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: URLEncoding.default)Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: URLEncoding.httpBody)// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3

JSON编码

以前我们需要把NSDictionary转为NSData然后用NSJSONSerialization转成JSON string JSON编码给简化了我们操作,它会创建一个JSON作为参数放在HTTP body中,对应的Content-Type 为application/json

例子

let parameters: Parameters = [    "foo": [1,2,3],    "bar": [        "baz": "qux"    ]]// Both calls are equivalentAlamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding(options: []))// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}}

Property List 编码

Property List编码会创建一个plist作为参数放在HTTP body中,对应的Content-Type 为application/x-plist

自定义 Encoding

如果框架提供的参数编码方式不能满足需求,可以自定义编码方式,下面是一个自定义JSONStringArrayEncoding转JSON string array 的例子

struct JSONStringArrayEncoding: ParameterEncoding {	private let array: [String]    init(array: [String]) {        self.array = array    }    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {        var urlRequest = try urlRequest.asURLRequest()        let data = try JSONSerialization.data(withJSONObject: array, options: [])        if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil {            urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")        }        urlRequest.httpBody = data        return urlRequest    }}

也可手动对请求进行编码

let url = URL(string: "https://httpbin.org/get")!var urlRequest = URLRequest(url: url)let parameters: Parameters = ["foo": "bar"]let encodedURLRequest = try URLEncoding.queryString.encode(urlRequest, with: parameters)

HTTP Headers

设置会直接改吧全局请求,可以满足请求头不断改吧的需求

let headers: HTTPHeaders = [    "Authorization": "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==",    "Accept": "application/json"]Alamofire.request("https://httpbin.org/headers", headers: headers).responseJSON { response in    debugPrint(response)}

在SessionManager中提供了所有请求的默认的请求头设置,Session Manager Configurations章节中细说 下面列举一些默认的参数

Accept-Encoding:gzip;q=1.0, compress;q=0.5Accept-Language:en;q=1.0User-Agent:iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0

Authentication验证

Authentication验证基于系统 URLCredential and URLAuthenticationChallenge框架,授权验证通常需要与后台服务器沟通来形成. 支持一下验证方案

  • HTTP Basic
  • HTTP Digest
  • Kerberos
  • NTLM 例子
let user = "user"let password = "password"Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)")    .authenticate(user: user, password: password)    .responseJSON { response in        debugPrint(response)    }
let user = "user"let password = "password"var headers: HTTPHeaders = [:]if let authorizationHeader = Request.authorizationHeader(user: user, password: password) {    headers[authorizationHeader.key] = authorizationHeader.value}Alamofire.request("https://httpbin.org/basic-auth/user/password", headers: headers)    .responseJSON { response in        debugPrint(response)    }
let user = "user"let password = "password"let credential = URLCredential(user: user, password: password, persistence: .forSession)Alamofire.request("https://httpbin.org/basic-auth/\(user)/\(password)")    .authenticate(usingCredential: credential)    .responseJSON { response in        debugPrint(response)    }

系列目录

  • Alamofire4.x开源代码分析(三)更新中

转载于:https://my.oschina.net/roycehe/blog/1057850

你可能感兴趣的文章
ORACLE数据库事务隔离级别介绍
查看>>
DHCP服务和http服务
查看>>
bitnami 使用记录
查看>>
Vsftpd+(linux)文件服务器
查看>>
JEPLUS之循环报表—JEPLUS软件快速开发平台
查看>>
从一个线上问题分析binlog与内部XA事务提交过程
查看>>
网页版式设计与平面构图
查看>>
view桌面模板控制usb权限
查看>>
吾日三省吾身
查看>>
【office培训】【王佩丰】Excel2010视频教程第2讲:单元格格式设置
查看>>
android inflate
查看>>
libxml2的编译与安装
查看>>
详述Google针对Android平板App发布的十大开发准则
查看>>
CentOS 7安装python3笔记
查看>>
XenApp 屏幕录像播放提示版本错误
查看>>
linux 通配符、元字符和特殊字符
查看>>
进程控制(学习笔记)
查看>>
hibernate中sorted collection和ordered collection区别
查看>>
“***”眼中云计算的“五大漏洞”
查看>>
网页练习
查看>>