Swift - 网络抽象层库Moya的使用详解2(请求参数说明)
四、请求参数说明
1,不同请求方法(HTTP Methods)下参数的传递
假设我们使用 Moya 定义了一个网络请求层(HttpbinAPI.swift),具体代码如下:
import Moya
//初始化Httpbin.org请求的provider
let HttpbinProvider = MoyaProvider<Httpbin>()
//请求分类
public enum Httpbin {
case ip
case anything(String) //请求数据
}
//请求配置
extension Httpbin: TargetType {
//服务器地址
public var baseURL: URL {
return URL(string: "http://httpbin.org")!
}
//各个请求的具体路径
public var path: String {
switch self {
case .ip:
return "/ip"
case .anything(_):
return "/anything"
}
}
//请求类型
public var method: Moya.Method {
return .post
}
//请求任务事件(这里附带上参数)
public var task: Task {
switch self {
case .anything(let param1):
var params: [String: Any] = [:]
params["param1"] = param1
params["param2"] = "2017"
return .requestParameters(parameters: params,
encoding: URLEncoding.default)
default:
return .requestPlain
}
}
//是否执行Alamofire验证
public var validate: Bool {
return false
}
//这个就是做单元测试模拟的数据,只会在单元测试文件中有作用
public var sampleData: Data {
return "{}".data(using: String.Encoding.utf8)!
}
//请求头
public var headers: [String: String]? {
return nil
}
}
通过修改 method 属性我们可以配置每个请求所使用的请求方法(GET、POST),不同的方法下参数传递的方式也是不同的:
- 使用 GET 方式请求时:参数会自动拼接在 url 后面

- 使用 POST 方式请求时:参数是放在在 HTTP body 里传递,url 上是看不到的。


2,可选参数(Optional request parameters)
如果我们将一个参数设为 nil,那么相当于将其从参数列表中删除,发送请求时是不会传递这个参数的。
(1)比如我们对 task 方法做个修改,将 param2 参数置为 nil。
public var task: Task {
switch self {
case .anything(let param1):
var params: [String: Any] = [:]
params["param1"] = param1
params["param2"] = nil
return .requestParameters(parameters: params,
encoding: URLEncoding.default)
default:
return .requestPlain
}
}
(2)可以看到发送请求时,param2 这个参数是不会被传递的(不管 GET 方式,还是 POST 方式)

楼主,要设置公共参数该如何设置呢
path: case .getProtocolInfoRegist: return "/cms/app/getProtocolInfo?typeId=REGIST"
是post请求,
返回:error = "Not Found";
message = "No message available";
path = "/cms/app/getProtocolInfo%3FtypeId=REGIST";
status = 404;
timestamp = "2018-02-05";
提示地址路径不对,那个问号变成%3F了,什么原因呢?
你好站长,我用URLEncoding.default 和post提交数据后台一直接收为空,用get就可以,为什么
航哥问一下 用moya时怎么做 统一的参数加密?
http://220.163.112.195:11009/jeeyczmq/AppLoginSp.do?checkuser&userName=linyu&password=123456
航哥 这个地址怎么拼成post或者get。我搞了好几天 完全弄不好,其中userName和password是需要的参数 ,其实就是一个登陆请求 接口是http://220.163.112.195:11009/jeeyczmq/AppLoginSp.do?checkuser
还有就是 如果需要从控制器 传进来参数,这种方式岂不是很麻烦
//请求任务事件(这里附带上参数)
public var task: Task {
switch self {
case .anything(let param1):
var params: [String: Any] = [:]
params["param1"] = param1
params["param2"] = "2017"
return .requestParameters(parameters: params,
encoding: URLEncoding.default)
default:
return .requestPlain
}
}
case .anything(let param1): 这个括号里边的是什么?