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

Swift中含多词艺术家名的API请求URL构建错误求助

解决方案

问题出在你先拼接艺术家和歌曲名再整体编码的方式,更稳妥的做法是分别对每个独立路径段(艺术家名称、歌曲名称)单独进行URL路径编码,再拼接成带斜杠的结构,这样既能保证斜杠作为路径分隔符被保留,又能将空格正确转为%20。

修改后的代码(推荐方案)

func fetchLyrics(artist: String, title: String) async throws -> String {
    // 分别编码每个路径段,确保特殊字符被正确处理
    guard let encodedArtist = artist.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed),
          let encodedTitle = title.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed),
          let baseURL = URL(string: baseURL),
          let artistPathURL = URL(string: encodedArtist, relativeTo: baseURL),
          let finalURL = URL(string: encodedTitle, relativeTo: artistPathURL) else {
        throw NetworkError.invalidURL
    }
    
    print("---->", finalURL.absoluteString)

    var request = URLRequest(url: finalURL)
    request.httpMethod = "GET"

    do {
        let (data, response) = try await session.data(for: request)
        
        guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
            throw NetworkError.invalidResponse
        }

        do {
            let lyricsResponse = try JSONDecoder().decode(LyricsResponse.self, from: data)
            return lyricsResponse.lyrics
        } catch {
            throw NetworkError.decodingFailed
        }
    } catch {
        throw NetworkError.requestFailed
    }
}

关键说明

  1. 单独编码路径段:艺术家和歌曲名是两个独立的URL路径组件,单独编码能避免斜杠被意外处理,同时确保空格、特殊字符被正确转为URL安全格式。
  2. 使用URL相对构造:相比字符串拼接,URL的相对路径构造方法会自动处理baseURL结尾是否带斜杠的问题,避免出现重复斜杠或路径缺失的情况,更可靠。

内容的提问来源于stack exchange,提问作者paul oyebanjo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:20:03