找了一大圈,发现国内根本没有解决的方法,去国外翻了一遍才找到,记录一下
重点: bodyEncoding: JSONEncoding.default
1.用moya测试登陆post接口,发现传过去的没有包装成json,百度了好久,全是千篇一律的答案,stackoverflow上也没找到,无奈去github的issue上翻,总算找到附上地址https://github.com/Moya/Moya/issues/1533。然后总结下经历,之前以为是header的content-type设置的问题,发现moya4.0更新了一个新的header参数可以设置header了,貌似以前是用一种复杂的方法设置的,叫什么endxxx的,没仔细研究那个东西,反正用不上,用上的时候再说吧,然后把parameter参数放到了task中,其实刚开始的研究思路主要放在寻找moya中是否有一个属性能设置json传递, .requestCompositeParameters(bodyParameters: parameters, bodyEncoding: JSONEncoding.default, urlParameters: [:]),然后就是这句话,主要在于JSONEncoding吧,这个是task中返回的。然后如果想用以前的parameters的话,可以自己写一个,然后把parameters传递给bodyParameters就行了。
贴上解决方法
import Moya
let loginProvider = NetworkUtility.getMoyaProvider(LoginAPI.self)
public enum LoginAPI {
case loginUser([String: Any])
case forgotPasswordOTP(String)
case resetPassword([String: Any])
}
extension LoginAPI: TargetType {
public var baseURL: URL { return URL(string: ConfigData.shared.getURL(forKey: DefaultsKeys.baseURL))! }
public var path: String {
switch self {
case .loginUser:
return ConfigData.shared.getURL(forKey: DefaultsKeys.login)
case .resetPassword:
return ConfigData.shared.getURL(forKey: DefaultsKeys.resetPassword)
case .forgotPasswordOTP:
return ConfigData.shared.getURL(forKey: DefaultsKeys.forgotPasswordOTP)
}
}
public var method: Moya.Method {
switch self {
case .loginUser:
return .post
case .resetPassword, .forgotPasswordOTP:
return .put
}
}
public var task: Task {
switch self {
case .loginUser(let bodyParameters),
//UserLogin dictionaryRepresentation is used for this
.resetPassword(let bodyParameters):
return .requestCompositeParameters(bodyParameters: bodyParameters,
bodyEncoding: JSONEncoding.default,
urlParameters: [:])
case .forgotPasswordOTP(let email):
return .requestCompositeParameters(bodyParameters: [User.Keys.email: email],
bodyEncoding: JSONEncoding.default,
urlParameters: [:])
}
}
public var headers: [String: String]? {
return NetworkUtility.getHeaders()
}
public var sampleData: Data {
var data: Data! = nil
switch self {
case .loginUser:
data = NetworkUtility.loadJSON(jsonName: "3.33.4Success")
case .resetPassword:
data = NetworkUtility.loadJSON(jsonName: "ResetPassword")
case .forgotPasswordOTP:
data = NetworkUtility.loadJSON(jsonName: "VerifyUser")
}
return data
}
}