iOS Swift moya框架發(fā)送數(shù)組作為請(qǐng)求參數(shù)(GET/POST)

Swift中網(wǎng)絡(luò)請(qǐng)求常用moya框架,但是這個(gè)框架有個(gè)缺點(diǎn),不支持?jǐn)?shù)組作為請(qǐng)求參數(shù)。也就是parameters只能傳字典類型,不管是GET請(qǐng)求還是POST請(qǐng)求都是如此

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

多數(shù)情況下不會(huì)有這樣的需求,但是有時(shí)候后臺(tái)就開(kāi)發(fā)出這樣的接口了,安卓那邊沒(méi)問(wèn)題,那我們iOS也不好說(shuō)不行。所以還是得想辦法支持一下。
刷了一下GitHub里面的issue,找到了解決辦法:

使用自定義的ParameterEncoding

POST請(qǐng)求:
Moya 使用字典作為JSON數(shù)據(jù)的根容器。但是有時(shí)候您需要將JSON數(shù)組作為根元素發(fā)送。這兒有一個(gè)解決方案,即通過(guò)編寫(xiě)您自己的參數(shù)編碼 :

定義一個(gè)struct或者一個(gè)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)
    }
}

這將會(huì)把.api接口的數(shù)據(jù)作為JSON數(shù)組["Yes", "What", "Abc"]發(fā)送。

GET請(qǐng)求:

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())
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容