AppleAPIを使ってアルバムの情報を取得したい
applemusicAPIを使っているのですが、リクエストができません。
入力した情報が文字化けします
発生している問題・エラーメッセージ
search(term:completion:) URL Session Task Failed unacceptableStatusCode(400)
該当のソースコード
swift
import UIKit enum ResponseError: Error { case invalidResponse(URLResponse?) case unacceptableStatusCode(Int) } class APIClient { static let imageCache: NSCache<NSString, UIImage> = { let cache = NSCache<NSString, UIImage>() cache.name = "APIClientImage" cache.countLimit = 20 cache.totalCostLimit = 10 * 1024 * 1024 return cache }() static let developerToken = "ディベロッパートークン" static let countryCode = "jp" func search(term: String, completion: @escaping (SearchResult?) -> Swift.Void) { let completionOnMain: (SearchResult?) -> Void = { searchResult in DispatchQueue.main.async { completion(searchResult) } } guard var components = URLComponents(string: "https://api.music.apple.com/v1/catalog/jp/search") else { return } let expectedTerms = term.replacingOccurrences(of: "", with: "+") let urlParameters = ["term": expectedTerms, "limit": "40", "types": "artists,albums"] var queryItems = [URLQueryItem]() for (key, value) in urlParameters { queryItems.append(URLQueryItem(name: key, value: value)) } components.queryItems = queryItems print(components.url!) var request = URLRequest(url: components.url!) request.httpMethod = "GET" request.setValue("Bearer (APIClient.developerToken)", forHTTPHeaderField: "Authorization") data(with: request) { data, error -> Void in guard error == nil else { print(#function, "URL Session Task Failed", error!) completionOnMain(nil) return } guard let searchResult = try? JSONDecoder().decode(SearchResult.self, from: data!) else { print(#function, "JSON Decode Failed"); completionOnMain(nil) return } completionOnMain(searchResult) } } func album(id: String, completion: @escaping (Resource?) -> Swift.Void) { let completionOnMain: (Resource?) -> Void = { resource in DispatchQueue.main.async { completion(resource) } } guard let url = URL(string: "https://api.music.apple.com/v1/catalog/jp/albums/(id)") else { return } var request = URLRequest(url: url) request.httpMethod = "GET" request.addValue("Bearer (APIClient.developerToken)", forHTTPHeaderField: "Authorization") data(with: request) { data, error -> Void in guard error == nil else { print(#function, "URL Session Task Failed", error!) completionOnMain(nil) return } guard let jsonData = try? JSONSerialization.jsonObject(with: data!), let dictionary = jsonData as? [String: Any], let dataArray = dictionary["data"] as? [[String: Any]], let albumDictionary = dataArray.first, let albumData = try? JSONSerialization.data(withJSONObject: albumDictionary), let album = try? JSONDecoder().decode(Resource.self, from: albumData) else { print(#function, "JSON Decode Failed"); completionOnMain(nil) return } completionOnMain(album) } } func image(url: URL, completion: @escaping ((UIImage?) -> Void)) { let completionOnMain: (UIImage?) -> Void = { image in DispatchQueue.main.async { completion(image) } } if let image = APIClient.imageCache.object(forKey: url.absoluteString as NSString) { print(#function, "image is Cacheed"); completion(image) return } data(with: URLRequest(url: url)) { data, error -> Void in guard error == nil else { print(#function, "URL Session Task Failed", error!) completionOnMain(nil) return } if let image = UIImage(data: data!) { APIClient.imageCache.setObject(image, forKey: url.absoluteString as NSString) completionOnMain(image) } else { print(#function, "image convert Failed"); completionOnMain(nil) } } } } extension APIClient { func data(with request: URLRequest, completion: @escaping (Data?, Error?) -> Swift.Void) { let task = URLSession.shared.dataTask(with: request) { data, response, error -> Void in guard error == nil else { completion(nil, error) return } guard let httpResponse = response as? HTTPURLResponse else { completion(nil, ResponseError.invalidResponse(response)) return } guard (200..<300).contains(httpResponse.statusCode) else { completion(nil, ResponseError.unacceptableStatusCode(httpResponse.statusCode)) return } completion(data, nil) } task.resume() } }
試したこと
いろいろ調べたり、しましたが、解決の糸口さえ見つかりません。。。。。
> 入力した情報が文字化けします
ってことですが、どこの箇所のどういうところで、どういうふうに文字化けしてるんでしょうか
https://api.music.apple.com/v1/catalog/jp/search?types=artists,albums&limit=40&term=%E3%81%8D%E3%81%AE%E3%81%93%E5%B8%9D%E5%9B%BD
これが、リクエストのURLなんですが、入力したterm部分が文字化けします
それは文字化けではなくて、パーセントエンコーディングなのでは・・・
まだ回答がついていません
会員登録して回答してみよう