質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

受付中

Swift Applemusic API の文字化け

anddy
anddy

総合スコア14

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0回答

0評価

0クリップ

38458閲覧

投稿2019/08/31 23:39

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() } }

試したこと

いろいろ調べたり、しましたが、解決の糸口さえ見つかりません。。。。。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2019/09/01 00:47

> 入力した情報が文字化けします ってことですが、どこの箇所のどういうところで、どういうふうに文字化けしてるんでしょうか
takabosoft

2019/09/03 06:58

それは文字化けではなくて、パーセントエンコーディングなのでは・・・

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。