API通信で値を取得していたのですが、突然値を取得することができなくなってしまいました。
API自体の変更はなく、web上で試したところ以前と同じように値の取得ができました。
APIからデータを取得するのは【Swift】URLSessionまとめの記事を参考にさせていただいています。
Swift
1 2let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in 3 if let error = error { 4 print ("error: (error)") 5 return 6 } 7 8 //型を調べたところOptional<NSURLResponse>でした。 9 let valueType = String(describing: type(of: response)) 10 11 //このguard節の部分でHTTPURLResponseにキャストできずに失敗してしまします。 12 guard let response = response as? HTTPURLResponse, 13 (200...299).contains(response.statusCode) else { 14 print ("server error") 15 return 16 } 17 18 guard let data = data, let jsonData = try? JSONDecoder().decode(API.self, from: data) else { 19 print("json conversion failed") 20 return 21 } 22 result(jsonData.converted) 23 } 24 task.resume() 25 }
NSURLResponse型をHTTPURLResponseにしてデータを取り出したいのですがどうしたら良いのでしょうか?
追記
いただいたアドバイスを参考に以下のコードで調べてみたところresponseCodeで400がかえってきてしまっているようでした。
guard let response = response as? HTTPURLResponse else { return } let code = response.statusCode if !(200...299).contains(response.statusCode) { return }
処理を行なっているロジック部分のコードは以下になります。ひらがな化APIのコンソールで試すと問題なく翻訳された値が帰ってきます。
どこが間違っているのでしょうか?
struct PostData: Codable { var app_id:String var request_id: String var sentence: String var output_type: String } ...省略 override func viewDidLoad() { super.viewDidLoad() let url = URL(string: "https://labs.goo.ne.jp/api/hiragana") var request = URLRequest(url: url!) request.httpMethod = "POST" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") let postData = PostData(app_id: "作成したID", request_id: "record003", sentence: "漢字が含まれた文章", output_type: "hiragana") guard let uploadData = try? JSONEncoder().encode(postData) else { return } request.httpBody = uploadData let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in if let error = error { print ("error: (error)") return } guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else { print ("server error") return } if let mimeType = response.mimeType, mimeType == "application/json", let data = data, let dataString = String(data: data, encoding: .utf8) { print ("got data: (dataString)") } } task.resume() }
追記その2
uploadDataの値をstrihg型に変換してみたところ以下のような値が出力されました
{"output_type":"hiragana","request_id":"record003","app_id":"作成したID","sentence":"変換する文字列"}
サイトにサンプルとして用意されていた入力例のjsonは以下のものでした
{"app_id":"[発行されたapp_id]", "request_id":"record003", "sentence":"漢字が混ざっている文章", "output_type":"hiragana"}
json自体に間違いはなさそうなんですがpostしている部分が間違っているのでしょうか?それともAPI自体に何か問題があるのでしょうか
回答2件
あなたの回答
tips
プレビュー