最近换了公司
以前的公司后台是java接口的路径:
https://potato.cn/api/rest/api/v1/xxxx/xxxx
现在的公司后台是PHP接口的路径:
https://www.potato.com/appapi.php?c=xxxx&a=xxxx
虚构路径,无法使用😝
问题
区别就在于,一个是斜杠,一个是?&【Get请求路径】
一开始没有觉得会有什么问题,可是在请求的时候发现,一直请求失败。
最后层层Debug发现,Moya封装后的请求路径是不对的!
正确应该是
https://www.potato.com/appapi.php?c=xxxx&a=xxxx
打印Moya请求路径返回
https://www.potato.com/appapi.php/c=xxxx&a=xxxx?
⚠️问题就是【?】的位置变了!!
源码
查看了源码后发现
Moya.png
Moya是用这个方法拼接URL的
新建了一个Playground测试
Playground.png使用这个方法 appendPathComponent 确实会造成【?】的位置不正确
解决办法
重写一个拼接URL的方法,然后修改Moya的源码
效果:
修改后.png
所以把这段代码复制到Moya里面的URL+Moya.swift
修改源码.png注释原来的代码,使用重写的方法,就可以正常请求接口了,这样不管什么格式的后台接口都可以使用Moya了😝。
import Foundation
public extension URL {
/// Initialize URL from Moya's `TargetType`.
init<T: TargetType>(target: T) {
// When a TargetType's path is empty, URL.appendingPathComponent may introduce trailing /, which may not be wanted in some cases
// See: https://github.com/Moya/Moya/pull/1053
// And: https://github.com/Moya/Moya/issues/1049
if target.path.isEmpty {
self = target.baseURL
} else {
// self = target.baseURL.appendingPathComponent(target.path)
self = target.baseURL.appendingPathComponentPath(target.path)
}
}
/// 拼接请求接口
///
/// - Parameter path: 参数路径
/// - Returns: 请求的接口路径
func appendingPathComponentPath(_ path: String) -> URL {
return URL(string: "\(self.absoluteString)\(path)")!
}
}
更新 2018-8-30
经过第一个评论的提醒,可以不改源码实现拼接?c=xxx&a=xxx的骚操作。
extension MyService: TargetType{
var baseURL: URL {
return URL(string: "https://www.potato.com/appapi.php")!
}
var method: Moya.Method {
return .post
}
var path: String {
switch self {
case .service(_,_):
return ""
}
}
var task: Task {
switch self{
case .service(let param1, let param2):
return .requestCompositeParameters(bodyParameters: ["param1": param1, "param2": param2], bodyEncoding: URLEncoding.httpBody, urlParameters: ["c": "xxx", "a": "xxx"])
}
}
注意:
- baseURL的最后不要加上问号
- bodyParameters就是post请求参数,urlParameters就是url需要拼接的参数。
好好学习,天天向上。<( ̄oo, ̄)/
Potato_zero.jpg
网友评论