【问题标题】:Send multiple type parameter with Alamofire to API - Swift使用 Alamofire 向 API 发送多个类型参数 - Swift
【发布时间】:2019-09-03 09:14:04
【问题描述】:

我需要用AlamofireAPI发送如下两个参数:

function: Stringjson: ModelPostFiltersShort

function: String:这是一个字符串名称。

而这个 (json: ModelPostFiltersShort) 参数如下所示:

struct ModelPostFiltersShort: Codable {
    var languages, types: [String]
    var categories: [Int]
    var page: Int
}

如何使用Alamofire 发送这些参数?

let params : [String : ?] = ["function": function,"??": ??]

Alamofire.request(url, method: .get, parameters: params????).responseJSON {
}

在 android 中,我发送如下值:

@POST("/web_service/mobile/rest")
Observable<Response<List<GetShortTermCoursesModel>>> getResultFilters(@Query("function") String function,
                                                                      @Body SendFiltersShortCourseModel sendFiltersShortCourseModel);

这个@Body SendFiltersShortCourseModel sendFiltersShortCourseModel参数没有名字!!

【问题讨论】:

    标签: swift alamofire


    【解决方案1】:

    创建包含所有主体(请求参数)的模型

    struct RequestParameters: Codable {
        let languages: [String]
        let types: [String]
        let categories: [Int]
        let page: Int
    }
    

    使用下面的代码准备并发送请求

    func sendRequest() {
    
            let requestParameters = RequestParameters(languages: ["fa"], types: ["modular"], categories: [70], page: 1)
            // create full parameters model
    
            let encoder = JSONEncoder() // create encoder to encode your request parameters to Data
    
            guard let data = try? encoder.encode(requestParameters) else {
                return
            } // create data
    
            let url = URL(string: "https://reg.mou.ir/web_service/mobile/rest?function=getShortTermCourses")! // create url
    
            var urlRequest = URLRequest(url: url) // create url request
    
            urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") // add all the headers you need
    
            urlRequest.httpBody = data // add your parameters
            urlRequest.httpMethod = "POST"
    
            // send your request
            Alamofire.request(urlRequest).responseString { (response) in
                switch response.result {
                case .success(let responseString):
                    print("Success: \(responseString)") // get your response here
                case .failure(let error):
                    print("Error: \(error.localizedDescription)") // get error if it appears here
                }
            }
        }
    

    【讨论】:

    • @德米特里。给我结果但不工作过滤器(让 modelPostFiltersShort = ModelPostFiltersShort(languages: ["en"], types: ["some"], categories: [1,2,3], page: 10)) 给我所有值来自 API。
    • @乔乔。我需要查看您的 api 文档。在这一点上,我无法猜测出了什么问题。可能是某些键错误或其他原因。
    • @德米特里。非常感谢。
    【解决方案2】:

    使用JSONEncoderModelPostFiltersShort's 实例中获取data,然后使用String's init(data:encoding:) 将其转换为String,即

    do {
        let data = try JSONEncoder().encode(obj) //this is body of the request
        let params = ["function": function] //these are query params
        if let url = URL(string: "YOUR_URL") {
            var urlRequest = URLRequest(url: url) // create url request
            urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
            urlRequest.httpBody = data
            //now create Alamofire request here...
        }
    } catch {
        print(error)
    }
    

    objModelPostFiltersShort 类型的实例

    【讨论】:

    • 告诉我这个错误:Alamofire.AFError.responseSerializationFailed(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength
    • 你在哪里传递了这些参数?
    • 在 android 中我发送如下值:@POST("/web_service/mobile/rest") Observable>> getResultFilters(@Query("function") String function , @Body SendFiltersShortCourseModel sendFiltersShortCourseModel);这个@Body SendFiltersShortCourseModel sendFiltersShortCourseModel 参数没有名字!!但是您使用的是“json”名称???