ひらがな化APIを使ってみる
はじめに
入力した漢字混じりの文字列をひらがな、カタカナに変換してくれるAPI「ひらがな化API」を試してみました。
今までAPIリクエストはOpenWeathermapにgetリクエストを送った事しかなかったので初めてPOSTに挑戦しました。
SwiftでURLSessionを使ってAPIにpostしている記事が少なかったです。iosアプリでHTTP通信を行う際はURLSessionではなくMoyaやAPIKitなどのライブラリを使うことが多いのかなと思います。
コード
URLRequestを設定する
まずAPIにpostを行う際送るデータを作成する必要があります。
そして通信先のAPIのリクエストパラメータを確認して追加しますひらがな化APIではapplication/x-www-form-urlencodedとapplication/jsonの2つの形式でpostリクエストを受け入れている様でした。
今回はJsonを使って送りますが一応application/x-www-form-urlencodedも追加しておきました
var request = URLRequest(url: URL(string: "https://labs.goo.ne.jp/api/hiragana")!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
postするデータをURLRequestに持たせる
Jsonを作成してURLRequestに持たせます。
httpBodyというプロパティの中にData?型で渡すようです。
JSON Parse用の構造体
struct PostData: Codable {
var app_id:String
var request_id: String
var sentence: String
var output_type: String
}
Postデータ
電光石火という感じをAPIに渡しています。output_typeはhiraganaとkatakanaがありますが今回はhiraganaでひらがなに変換します。
let postData = PostData(app_id: "各自が作成したID", request_id: "record003", sentence: "電光石火", output_type: "hiragana")
guard let uploadData = try? JSONEncoder().encode(postData) else {
print("json生成に失敗しました")
return
}
request.httpBody = uploadData
APIへpostしてresponseを受け取る
設定ができれば作成したURLRequestをAPIへ送ります。
OpenWethermapを使った時も今回も忘れたのですが.resume()を呼ばないとリクエストの処理が走らないので書き忘れない様注意してください。
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
}
guard let data = data, let jsonData = try? JSONDecoder().decode(Rubi.self, from: data) else {
print("json変換に失敗しました")
return
}
print(jsonData.converted)
}
task.resume()
コード一覧
app_idだけ各自で作成をしてコードに入れればそのまま動きます。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var request = URLRequest(url: URL(string: "https://labs.goo.ne.jp/api/hiragana")!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let postData = PostData(app_id: "各自が作成したID", request_id: "record003", sentence: "電光石火", output_type: Convert.hiragana.rawValue)
guard let uploadData = try? JSONEncoder().encode(postData) else {
print("json生成に失敗しました")
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
}
guard let data = data, let jsonData = try? JSONDecoder().decode(Rubi.self, from: data) else {
print("json変換に失敗しました")
return
}
print(jsonData.converted)
}
task.resume()
}
}
struct Rubi:Codable {
var request_id: String
var output_type: String
var converted: String
}
struct PostData: Codable {
var app_id:String
var request_id: String
var sentence: String
var output_type: String
}