如何在Moya库中正确添加URL查询及JSON请求参数
核心问题
你的实现不符合Moya TargetType 的设计约定,3处错误会直接导致URL查询参数拼接异常:
baseURL仅用于存放接口根域名+基础路径,不能提前拼接?appid=[API_Key]这类查询参数,否则会触发Moya的URL拼接逻辑错误path属性仅用于返回接口的路径分段,绝对不能拼接&q=xxx这类查询字符串,会直接破坏URL结构- 城市名查询的参数key写错了,OpenWeather天气接口要求城市名对应的参数是
q,不是你写的name
正确修改方案
把所有查询参数统一放到task中处理,baseURL和path只保留纯地址段,公共参数(比如appid)可以统一封装避免重复代码:
enum Networking{ case showLatLon(_ lat: String,_ lon: String) case showName(_ name: String) } extension Networking: TargetType{ // 仅存根地址,不带任何查询参数 var baseURL: URL { return URL(string: "https://api.openweathermap.org/data/2.5")! } // 仅返回接口路径,不拼参数 var path: String { switch self { case .showLatLon, .showName: return "/weather" } } var method: Moya.Method { switch self{ case .showLatLon, .showName: return .get } } var task: Task { // 统一注入公共参数appid var params: [String: Any] = ["appid": "[替换成你的实际API Key]"] switch self{ case .showLatLon(let lat, let lon): params["lat"] = lat params["lon"] = lon // 明确指定使用query编码,把参数拼到URL尾部,避免默认编码的歧义 return .requestParameters(parameters: params, encoding: URLEncoding.queryString) case .showName(let name): params["q"] = name // 修正参数名为接口要求的q return .requestParameters(parameters: params, encoding: URLEncoding.queryString) } } var headers: [String : String]? { return ["Content-Type":"application/json"] } }
最终请求效果
修改后Moya会自动完成URL拼接,生成的请求地址完全符合OpenWeather的接口要求:
- 经纬度查询示例:
https://api.openweathermap.org/data/2.5/weather?appid=xxx&lat=40&lon=40 - 城市名查询示例:
https://api.openweathermap.org/data/2.5/weather?appid=xxx&q=London
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

