ひらがな化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-urlencodedapplication/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
}

参考文献

Uploading Data to a Website

ひらがな化API

application/x-www-form-urlencoded