Swift - 网络抽象层库Moya的使用详解2(请求参数说明)
作者:hangge | 2017-09-27 08:10
四、请求参数说明
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 方式)
全部评论(7)
楼主,要设置公共参数该如何设置呢
站长回复:你是指所有请求都要带的参数吗?可以使用自定义插件实现,具体看我之前写的这篇文章:Swift - 网络抽象层库Moya的使用详解8(创建自定义插件)
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了,什么原因呢?
站长回复:post的时候,如果url后面想带参数,不能拼接在 path 后面(会被转义),而是要拼在baseURL后面。具体可以参考我的另一篇文章里的代码:Swift - 网络抽象层库Moya的使用详解4(单文件上传:文件流方式)
你好站长,我用URLEncoding.default 和post提交数据后台一直接收为空,用get就可以,为什么
站长回复:理论上应该都是没问题的。具体原因还要靠你自己那边调试了,我也帮不了你了。
航哥问一下 用moya时怎么做 统一的参数加密?
站长回复:参数加密方式都是在task里面设置的。默认encoding使用的是URLEncoding,你也可以继承ParameterEncoding来实现自己的加密方法。
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
站长回复:/** TargetType 大概这么定义 **/
还有就是 如果需要从控制器 传进来参数,这种方式岂不是很麻烦
站长回复:怎么会呢,这种动态的参数不管用什么方式总是要传递的。
//请求任务事件(这里附带上参数)
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): 这个括号里边的是什么?
站长回复:是调用请求时,外面传进来的参数。你如果看了前面一篇文章应该会明白:Swift - 网络抽象层库Moya的使用详解1(安装配置、基本用法)