美文网首页收藏文章
iOS Swift moya框架发送数组作为请求参数(GET/P

iOS Swift moya框架发送数组作为请求参数(GET/P

作者: jzhang | 来源:发表于2019-03-21 22:36 被阅读204次

    Swift中网络请求常用moya框架,但是这个框架有个缺点,不支持数组作为请求参数。也就是parameters只能传字典类型,不管是GET请求还是POST请求都是如此

    return .requestParameters(parameters: parameters, encoding: JSONEncoding.default)
    

    多数情况下不会有这样的需求,但是有时候后台就开发出这样的接口了,安卓那边没问题,那我们iOS也不好说不行。所以还是得想办法支持一下。
    刷了一下GitHub里面的issue,找到了解决办法:

    使用自定义的ParameterEncoding

    POST请求:
    Moya 使用字典作为JSON数据的根容器。但是有时候您需要将JSON数组作为根元素发送。这儿有一个解决方案,即通过编写您自己的参数编码 :

    定义一个struct或者一个class:

    import Alamofire
    
    struct JSONArrayEncoding: ParameterEncoding {
        static let `default` = JSONArrayEncoding()
    
        func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
            var request = try urlRequest.asURLRequest()
    
            guard let json = parameters?["jsonArray"] else {
                return request
            }
    
            let data = try JSONSerialization.data(withJSONObject: json, options: [])
    
            if request.value(forHTTPHeaderField: "Content-Type") == nil {
                request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            }
    
            request.httpBody = data
    
            return request
        }
    }
    

    配置target:

    public var task: Task {
        switch self {
        case .api:
            return .requestParameters(parameters: ["jsonArray": ["Yes", "What", "abc"]], encoding: JSONArrayEncoding.default)
        }
    }
    

    这将会把.api接口的数据作为JSON数组["Yes", "What", "Abc"]发送。

    GET请求:

    struct BracketLessGetEncoding: ParameterEncoding {
        func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
            var request = try URLEncoding().encode(urlRequest, with: parameters)
            request.url = URL(string: request.url!.absoluteString.replacingOccurrences(of: "%5B%5D=", with: "="))
            return request
        }
    }
    

    配置target:

    public var task: Task {
        switch self {
        case .api:
            return .requestParameters(parameters:parameters, encoding: BracketLessGetEncoding())
        }
    }
    

    相关文章

      网友评论

        本文标题:iOS Swift moya框架发送数组作为请求参数(GET/P

        本文链接:https://www.haomeiwen.com/subject/ygihvqtx.html