You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:15:58