sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

C# RESAS API を利用する

f:id:shikaku_sh:20210823173353p:plain:w300

都道府県コードや産業分類など、地域の情報(地域経済分析システム)を取得するやり方のひとつに RESAS がある。

RESAS は、2015 年から内閣府の地方創生推進室が開始したサービスで、2016 年から API の提供を開始しており、利用目的などのユーザー登録をすれば誰でも無料で利用できます。

中には都道府県コードなどの単純なデータもあるので、とりあえず使ってみるサンプルです。

都道府県コード

都道府県コードを取得するサンプルはこんな感じ。

public class ResasClient
{
    private string _BaseUrl = "https://opendata.resas-portal.go.jp/";

    public async Task<IEnumerable<Prefecture>> GetPrefecturesAsync(string key)
    {
        string prefecturesUri = "api/v1/prefectures";
        string url = _BaseUrl + prefecturesUri;
        string response = await GetHttpResponse(key, url);

        ApiResult<Prefecture>? result = null;

        if (response != null)
        {
            var options = new JsonSerializerOptions();

            result = JsonSerializer.Deserialize<ApiResult<Prefecture>>(response, options);
        }

        return result?.Result ?? new List<Prefecture>();
    }

    private async Task<string> GetHttpResponse(string key, string url)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("X-API-KEY", key);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var response1 = await client.GetAsync(url);
            var response2 = await response1.Content.ReadAsStringAsync();

            return response2;
        }
    }
}

以下のような API からは以下の JSON データが返却されるので、丁度良いクラスで受け取るとよいです。

{
    "message":null,
    "result":[{
        "prefCode":1,"prefName":"北海道"},
        ...
        {"prefCode":46,"prefName":"鹿児島県"},
        {"prefCode":47,"prefName":"沖縄県"}
    ]
}

JSON 対応クラスの例

public class ApiResult<T>
{
    [JsonPropertyName("message")]
    public string Message { get; set; } = "";

    [JsonPropertyName("result")]
    public IEnumerable<T>? Result { get; set; }
}

public class Prefecture
{
    /// <summary>
    /// 都道府県コードを取得または設定します。
    /// </summary>
    [JsonPropertyName("prefCode")]
    public int Code { get; set; } = 0;
    /// <summary>
    /// 都道府県名を取得または設定します。
    /// </summary>
    [JsonPropertyName("prefName")]
    public string Name { get; set; } = "";
}

テスト

RESAS API を利用するためにはユーザーごとの API キーが必要です。 API キーの管理については、過去に記述したとおり、アプリケーションでの利用に気をつけてください。

安易に API キーをコード中に含めないことを強く推奨します。(テストコードでも)

public class Tests
{
    private string ApiKey { get; set; } = "";

    [OneTimeSetUp]
    public void OneTimeSetUp()
    {
        // var api = Environment.GetEnvironmentVariable("RESAS_API", EnvironmentVariableTarget.User);
        DotNetEnv.Env.Load(".env");
        var key = DotNetEnv.Env.GetString("RESAS_API");

        ApiKey = key;
    }

    [Test]
    public async Task RESAS_都道府県コード()
    {
        var client = new ResasClient();
        var prefectures1 = await client.GetPrefecturesAsync(ApiKey);

        Assert.AreEqual(prefectures1.Count(), 47);
    }
}

サンプル

GitHub にサンプルを公開しています。サンプルでは、産業大分類を追加しています。

単純にテキストファイルから読み込む例も追加。(ネットから正しくデータを取得できなかった場合などに利用するとよいかも)

参考