
Нашел, интересный web service, самое важное, пока рабочий.
SOAP Web service
Содержит большое количество методов, которые возвращают много полезной справочной информации по странам и городам. Протестируем его, и напишем проект с заданием.
Задание:
Получить все ISO коды стран. Сервис ListOfCountryNamesByCode.
По коду ISO получить все столицы стран. Сервис CapitalCity.
Создать таблицу: COUNTRY_CATALOG.
Вставить полученные данные в таблицу.
Распарсить сайт countrycode.org и дополнить таблицу необходимыми данными.
В итоге получается заполненная таблица, с разных источников данных полученных разными способами.
Использовал:
Spring jdbc | Spring context | Wsimport | Jsoup | NamedParameterJdbc |
Jackson | JAXB | MySQL | MAMP | Allure2 |
models – пакет с генерированными классами по wsdl с использованием Wsimport. Тут описывал как генерировать классы.
modelDb – пакет c описанной таблицей SQL -> Java.
CheckCodeRecord – сам исполняемый тест.
Создадим таблицу.
-- Create TABLE CREATE TABLE COUNTRY_CATALOG ( id INT(11) NOT NULL AUTO_INCREMENT, COUNTRY VARCHAR(150), CAPITAL VARCHAR(150), COUNTRY_CODE VARCHAR(150), ISO_CODES2 VARCHAR(150), ISO_CODES3 VARCHAR(150), POPULATION VARCHAR(150), AREA_KM2 VARCHAR(150), GDP_$USD VARCHAR(150), PRIMARY KEY (id) ); DROP TABLE COUNTRY_CATALOG; SELECT * FROM COUNTRY_CATALOG; |
В db.xml опишем bean подключения к БД.
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!--fix UTC defect ?serverTimezone=UTC--> <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> |
Далее по порядку.
Soap request к web service.
//START. Soap request ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"application-config.xml"}); CountryInfoService bean = context.getBean(CountryInfoService.class); ArrayOftCountryCodeAndName arrayOftCountryCodeAndName = bean.getCountryInfoServiceSoap().listOfCountryNamesByCode(); List<TCountryCodeAndName> tCountryCodeAndName = arrayOftCountryCodeAndName.getTCountryCodeAndName(); |
Пробежимся циклом по разным сервисам, для сбора максимально большого количества нужной информации.
for (TCountryCodeAndName codeAndName : tCountryCodeAndName){ String isoCode = codeAndName.getSISOCode(); String countryName = codeAndName.getSName(); String capitalCity = bean.getCountryInfoServiceSoap().capitalCity(isoCode); //Get Country Currency TCurrency currency = bean.getCountryInfoServiceSoap().countryCurrency(isoCode); String currencyCode = currency.getSISOCode(); String currencyName = currency.getSName(); //Get Country Phone Code String phoneCode = bean.getCountryInfoServiceSoap().countryIntPhoneCode(isoCode); //Get Country language TCountryInfo countryLanguageList = bean.getCountryInfoServiceSoap().fullCountryInfo(isoCode); List<TLanguage> tLanguage = countryLanguageList.getLanguages().getTLanguage(); |
Начнем заполнять таблицу.
//START. Record ISOCode and Country name in db ClassPathXmlApplicationContext contextdb = new ClassPathXmlApplicationContext("db.xml"); nquSql = new NamedParameterJdbcTemplate(contextdb.getBean(DataSource.class)); HashMap<String, Object> param = new HashMap<>(); param.put("isoCode", isoCode); param.put("countryName", countryName); param.put("capitalCity", capitalCity); param.put("countryLanguage", countryLanguage); param.put("currencyCode", currencyCode); param.put("currencyName", currencyName); param.put("phoneCode", phoneCode); String insertSql = "INSERT INTO COUNTRY_CATALOG VALUES (id, :countryName, :capitalCity, :countryLanguage, NULL, :isoCode, NULL, NULL, NULL, NULL, :currencyCode, :currencyName, :phoneCode);"; // execute insert + count number of records / records processed by the executed query nquSql.update(insertSql, param); update1 ++; //STOP. Record in db; |
Распарсим сайт countrycode.org (библиотека jsoup) и соберем в список информацию. Сравним с нашей таблицей.
Document doc = Jsoup.parse(new File("D:\\JAVA\\Java_SRC\\CountryCodeProject\\src\\main\\resources\\countrycode.html"), "utf-8"); Elements inputElements = doc.select("div.visible-md > table > tbody > tr"); int update2 = 0; for (Element inputElement : inputElements) { String country = inputElement.select("td:nth-child(1)").text(); String countryCode = inputElement.select("td:nth-child(2)").text(); String isoCode2 = inputElement.select("td:nth-child(3)").text().substring(0,2); String isoCode3 = inputElement.select("td:nth-child(3)").text().substring(5,8); String population = inputElement.select("td:nth-child(4)").text().replace(" ", ""); String areaSq = inputElement.select("td:nth-child(5)").text().replace(" ", ""); String gpd = inputElement.select("td:nth-child(6)").text(); HashMap<String, Object> param = new HashMap<>(); param.put("ISO_CODES2", isoCode2); List<CountryCatalog> newDatasetAirs = nquSql.query("SELECT * FROM COUNTRY_CATALOG WHERE ISO_CODES2 = :ISO_CODES2", param, new BeanPropertyRowMapper<>(CountryCatalog.class)); |
Обновим теперь нашу таблицу с учетом новых данных.
if (newDatasetAirs.size() != 0){ HashMap<String, Object> param2 = new HashMap<>(); param2.put("isoCode2", isoCode2); param2.put("isoCode3", isoCode3); param2.put("countryCode", countryCode); param2.put("population", population); param2.put("areaSq", areaSq); param2.put("gpd", gpd); String updateSql = "UPDATE COUNTRY_CATALOG SET COUNTRY_CODE = :countryCode, ISO_CODES3 = :isoCode3, POPULATION = :population, AREA_KM2 = :areaSq, GDP_$USD = :gpd WHERE ISO_CODES2 = :isoCode2"; nquSql.update(updateSql, param2); } |
Получаем информативную, заполненную таблицу.
Ссылка на GitHub:
Github CountryProject