【发布时间】:2015-08-10 02:02:20
【问题描述】:
我正在使用Moya Swift 框架构建在Alamofire 之上的网络层。
目前,我正在尝试使用具有相同键的 URL 编码参数发送请求。
即http://some-site/request?param=v1&param=v2&param=v3
我已经尝试像这样将这些参数分组到 Set 或 NSSet 或 Array 中,但没有任何帮助达到预期的结果。
["param": ["v1", "v2", "v3"]];
["param": Set(arrayLiteral: "v1", "v2", "v3")]
Moya 或 Alamofire 本身的任何帮助都将不胜感激。
编辑:这里有一些示例代码来给出基本的想法:
Api 路由器设置
import Moya
// MARK:- Enum Declaration
enum ApiRouter {
case XAuth(login: String, password: String)
case SomeRequest(params: [String])
}
// MARK:- Moya Path
extension ApiRouter: MoyaPath {
var path: String {
switch self {
case .XAuth:
return "/authorization"
case .SomeRequest:
return "/some-request"
}
}
}
// MARK:- Moya Target
extension ApiRouter: MoyaTarget {
private var base: String {
return "http://some-site"
}
var baseURL: NSURL {
return NSURL(string: base)!
}
var parameters: [String: AnyObject] {
switch self {
case .XAuth(let login, let password):
return [
"email": login,
"password": password
]
case .SomeRequest(let params):
return [
"params": params
]
}
var method: Moya.Method {
switch self {
case .XAuth:
return .POST
case .SomeRequest,
return .GET
}
}
var sampleData: NSData {
switch self {
case .XAuth:
return "{}".dataUsingEncoding(NSUTF8StringEncoding)
case .ServiceRequests:
return "{}".dataUsingEncoding(NSUTF8StringEncoding)
}
}
}
API 提供者设置
let endpointsClosure = { (target: ApiRouter) -> Endpoint<ApiRouter> in
let endpoint = Endpoint<ApiRouter>(
URL: target.baseURL.URLByAppendingPathComponent(target.path).absoluteString!,
sampleResponse: EndpointSampleResponse.Success(200, { target.sampleData }),
method: target.method,
parameters: target.parameters,
parameterEncoding: parameterEncoding(target)
)
switch target {
case .XAuth:
return endpoint
default:
let token = "some-token"
return endpoint.endpointByAddingHTTPHeaderFields(["Authorization": "Bearer: \(token)"])
}
}
func parameterEncoding(target: ApiRouter) -> Moya.ParameterEncoding {
switch target {
case .XAuth:
return .JSON
case .SomeRequest:
return .URL
}
}
let apiProvider = MoyaProvider(endpointsClosure: endpointsClosure)
apiProvider.request(ApiRouter.SomeRequest(params: ["v1", "v2", "v3"], completion: { (data, statusCode, response, error) in
/* ... */
})
谢谢。
【问题讨论】:
-
您能否指定,您的 API 是“GET”还是“POST”?
-
@SohilR.Memon 这是 GET 请求
-
你能贴一些代码吗?
-
你能展示一下你用来测试的api吗
-
@SohilR.Memon 编码什么?!看,我需要做的是使用 Moya 框架发送带有具有相同键的 URL 参数的 GET 请求。将您的想法与任何网络和服务器隔离开来,以字符串的形式考虑这一点。最后我需要得到这个 URL 字符串
http://some-site/request?param=v1&param=v2&param=v3。它与 POST 和其他东西无关,只是使用 Moya 或 Alamofire 框架使用相同参数键的普通 GET 请求。你知道如何实现吗?