祝日を取得するために何かいいものはないかと調べて見たら、カレンダーサービスさんに行き当たりました。
jsonやxml、CSVなどに対応しているようなのですが、カレンダーサービスさん自身の結果でjsonが返ってこない。。。 xmlで行おうと思ったのですが、ライブラリのコンパイルがうまく行かず断念
ということで今回はCSV形式で取得することにしました。
HTTP 通信のライブラリはokhttpを使いました。
gradleに
compile 'com.squareup.okhttp3:okhttp:3.6.0'
とりあえず取ってくる範囲を固定にしました。 2015/01~2030/12 細かい設定は直接カレンダーサービスさんを触っていただければと
import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; public class CalendarApi { private static String url = "http://calendar-service.net/cal?start_year=2016&start_mon=1&end_year=2030&end_mon=12&year_style=normal&month_style=numeric&wday_style=ja&format=csv&zero_padding=1"; public static void getData(Callback callback) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(callback); } }
呼び出し側
CalendarApi.getData(callback);
コールバックの前にBeanを作りました。
public class CalendarBean implements Serializable { private String year; private String month; private String day; private String j_cal; private String j_cal_year; private String week; private int weekNo; private String holidayName; public String getYear() { return year; } public void setYear(String year) { this.year = year; } public String getMonth() { return month; } public void setMonth(String month) { this.month = month; } public String getDay() { return day; } public void setDay(String day) { this.day = day; } public String getJ_cal() { return j_cal; } public void setJ_cal(String j_cal) { this.j_cal = j_cal; } public String getJ_cal_year() { return j_cal_year; } public void setJ_cal_year(String j_cal_year) { this.j_cal_year = j_cal_year; } public String getWeek() { return week; } public void setWeek(String week) { this.week = week; } public int getWeekNo() { return weekNo; } public void setWeekNo(int weekNo) { this.weekNo = weekNo; } public String getHolidayName() { return holidayName; } public void setHolidayName(String holidayName) { this.holidayName = holidayName; } }
コールバック処理
private HashMap<String,CalendarBean> beanHashMap = new HashMap<>(); private Callback callback = new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } /** * Called when the HTTP response was successfully returned by the remote server. The callback may * consume the response body on another thread. * <p> * <p>Note that transport-layer success (receiving a HTTP response code, headers and body) does * not necessarily indicate application-layer success: {@code response} may still indicate an * unhappy HTTP response code like 404 or 500. * * @param call * @param response */ @Override public void onResponse(Call call, okhttp3.Response response) throws IOException { String[] rows = body.split("\n"); boolean first = true; for (String row : rows) { if (first) { first = false; continue; } String[] columns = row.split(","); CalendarBean calendarBean = new CalendarBean(); calendarBean.setYear(columns[0]); calendarBean.setMonth(columns[1]); calendarBean.setDay(columns[2]); calendarBean.setJ_cal(columns[3]); calendarBean.setJ_cal_year(columns[4]); calendarBean.setWeek(columns[5]); calendarBean.setWeekNo(Integer.parseInt(columns[6])); if (columns.length == 8) { calendarBean.setHolidayName(columns[7]); } beanHashMap.put(columns[0].concat(columns[1].concat(columns[2])),calendarBean); } } }; ということでyyyyMMddをキーとしたHashMapの完成です。