当前位置: > > > Swift - 网络抽象层库Moya的使用详解2(请求参数说明)

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 属性我们可以配置每个请求所使用的请求方法(GETPOST),不同的方法下参数传递的方式也是不同的:
  • 使用 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
  • 7楼
    2018-09-28 15:14
    lyc

    楼主,要设置公共参数该如何设置呢

    站长回复

    你是指所有请求都要带的参数吗?可以使用自定义插件实现,具体看我之前写的这篇文章:Swift - 网络抽象层库Moya的使用详解8(创建自定义插件)

  • 6楼
    2018-02-05 14:50
    Seagulls

    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(单文件上传:文件流方式)

  • 5楼
    2018-01-11 13:25
    swift

    你好站长,我用URLEncoding.default 和post提交数据后台一直接收为空,用get就可以,为什么

    站长回复

    理论上应该都是没问题的。具体原因还要靠你自己那边调试了,我也帮不了你了。

  • 4楼
    2017-12-14 20:13
    6个未接来电

    航哥问一下 用moya时怎么做 统一的参数加密?

    站长回复

    参数加密方式都是在task里面设置的。默认encoding使用的是URLEncoding,你也可以继承ParameterEncoding来实现自己的加密方法。

  • 3楼
    2017-12-07 10:27
    根根

    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 大概这么定义 **/

    extension DouBan: TargetType {
        //服务器地址
        public var baseURL: URL {
            return URL(string: "http://220.163.112.195:11009/jeeyczmq")!
        }
        
        //各个请求的具体路径
        public var path: String {
            switch self {
            case .login:
                return "/AppLoginSp.do?checkuser"
            }
        }
        
        //请求任务事件(这里附带上参数)
        public var task: Task {
            switch self {
            case .login(let userName, let passWord):
                var params: [String: Any] = [:]
                params["userName"] = userName
                params["passWord"] = passWord
                return .requestParameters(parameters: params,
                                          encoding: URLEncoding.default)
            }
        }
    //.......

  • 2楼
    2017-11-29 13:58
    cocoa

    还有就是 如果需要从控制器 传进来参数,这种方式岂不是很麻烦

    站长回复

    怎么会呢,这种动态的参数不管用什么方式总是要传递的。

  • 1楼
    2017-11-29 13:57
    cocoa

    //请求任务事件(这里附带上参数)
    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(安装配置、基本用法)