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 } }
关键说明
- 单独编码路径段:艺术家和歌曲名是两个独立的URL路径组件,单独编码能避免斜杠被意外处理,同时确保空格、特殊字符被正确转为URL安全格式。
- 使用
URL相对构造:相比字符串拼接,URL的相对路径构造方法会自动处理baseURL结尾是否带斜杠的问题,避免出现重复斜杠或路径缺失的情况,更可靠。
内容的提问来源于stack exchange,提问作者paul oyebanjo
相关产品推荐
相关产品推荐

