使用 Alamofire 向 API 发送多个类型参数 - Swift
Posted
技术标签:
【中文标题】使用 Alamofire 向 API 发送多个类型参数 - Swift【英文标题】:Send multiple type parameter with Alamofire to API - Swift 【发布时间】:2019-09-03 09:14:04 【问题描述】:我需要用Alamofire
向API
发送如下两个参数:
function: String
和json: 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
参数没有名字!!
【问题讨论】:
【参考方案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】:使用JSONEncoder
从ModelPostFiltersShort'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)
obj
是ModelPostFiltersShort
类型的实例
【讨论】:
告诉我这个错误:Alamofire.AFError.responseSerializationFailed(原因:Alamofire.AFError.ResponseSerializationFailureReason.inputDataNilOrZeroLength 你在哪里传递了这些参数? 在 android 中我发送如下值:@POST("/web_service/mobile/rest") Observable@Body SendFiltersShortCourseModel sendFiltersShortCourseModel
参数没有名字!!但是您使用的是“json”名称???以上是关于使用 Alamofire 向 API 发送多个类型参数 - Swift的主要内容,如果未能解决你的问题,请参考以下文章
使用 Alamofire 在 HTTP Body 中发送数据