NAVIADDRESS API
Java
Как использовать Naviaddress API с помощью языка Java
Давайте напишем небольшую программу на языке программирования Java, которая будет получать краткую информацию о карточке по заданному навиадресу, также будет выводить список изображений.

Сначала подготовимся
Naviaddress API возвращает данные в формате JSON, поэтому для работы с этим форматом данных нам потребуется специальная библиотека для парсинга. Для решения этой задачи можно воспользоваться разработкой компании Google - пакетом Gson.

Скачайте файл библиотеки по данной ссылке с помощью меню Download/jar в правом верхнем углу и разместите его в тот же каталог, в котором будет находиться ваша программа. Номер версии библиотеки в будущем может измениться. На момент написания этой статьи он был 2.8.5.
С помощью любимого редактора кода создайте новый файл для нашей будущей программы Jnavi.java и создайте скелет будущей программы.

В начале файла укажите директивы для импорта необходимых классов:
  • для работы с классами
  • для работы с HTTP-запросами
  • для работы с Gson для парсинга JSON-объектов

Обратите внимание, что Naviaddress API использует защищенное соединение и позволяет связываться по протоколу HTTPS
import java.util.List;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import javax.net.ssl.HttpsURLConnection;
import java.net.URL;

import com.google.gson.Gson;
Создадим скелет нашей будущей программы, которая как обычно будет вызываться через метод main().

Обратите внимание, что для корректной работы программы нам потребуется обязательно обработать исключение Exception, которое можно выполнить с помощью блока try/catch.
public class Jnavi {
	public static void main(String[] args) {
	    try { 

	    	// Здесь будет текст нашей основной программы

	    } catch(Exception e) { 
	        throw new RuntimeException(e); 
	    }		
	}
}
Сначала давайте выполним GET запрос к серверу Naviaddress и получим строку с данными, содержащими JSON-объект. В приведенном ниже отрывку кода мы подготавливаем запрос и устанавливаем его параметры:
  • метод запроса GET
  • тип возвращаемого значения (нам потребуются данные в формате JSON)
	    	// Подготавливаем запрос 
	        URL url = new URL("https://staging-api.naviaddress.com/api/v1.5/Addresses/7/0022"); 
	        HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 

	        // Устанавливаем параметры запроса
			con.setRequestMethod("GET");
			con.setRequestProperty("User-Agent", "application/json");
Теперь пришло время получить ответ от сервера, которая сначала будет сохранена в буфер stringBuffer и потом с помощью несложных манипуляций преобразована в текстовую строку jsonString.

В завершение давайте выведем на экран полученные результаты.
			// Получаем ответ в буфер
			BufferedReader in = new BufferedReader(
			        new InputStreamReader(con.getInputStream()));

			String inputLine;
			StringBuffer stringBuffer = new StringBuffer();

			// Добавляем данные из буфера в строку
			while ((inputLine = in.readLine()) != null) {
				stringBuffer.append(inputLine);
			}
			in.close();

			// Ответ получен
			String jsonString = stringBuffer.toString();

			// Печать результатов
			System.out.println(jsonString);
Та-дам! Наша программа готова, теперь можно скомпилировать ее и запустить на исполнение.
> javac Jnavi.java
> java Jnavi
Если мы все сделали правильно, то на экране консоли мы должны получить вот такое вот сообщение. Невооруженным взглядом видно, что мы получили JSON-объект (что и требовалось).
{"result":{"address_description":{},"address_type":"premium","booking":{},"category":{"id":10},"contacts":[{"type":"phone","value":"7 (499) 253-11-83"},{"type":"vkontakte","value":"https://vk.com/naviaddress"},{"type":"instagram","value":"https://instagram.com/naviaddress"},{"type":"website","value":"https://naviaddress.com"}, ...
Обрабатываем JSON

Отлично, теперь для дальнейшей работы нам нужно будет преобразовать JSON в более привычный для Java формат объектов. C полным описанием структур данных, возвращаемых сервером Naviaddress можно на ресурсе swagger.naviaddress.com.

Создадим специальный набор вспомогательных классов, в которые мы будем преобразовывать полученный объект.
  • Класс Response - по сути - это оберточный класс, в котором нас интересует только значение поля result
  • Класс Result - для использованного в статье запроса (GET Addresses) сервер возвращает структуру с данными полученного адреса. Для данного примера нас будут интересовать поля container, naviaddress и description.
  • Класс Cover содержит информацию о фотографиях, использованных для оформления карточки навиадреса. Они приводятся в виде списка значений типа CoverImage.
  • Класс CoverImage описывает каждую из фотографий навиадреса. В поле image расположена URL на саму фотографию

Для удобства мы добавили функцию преобразования в строку toString() в каждый из классов.
class Response {
  public Result result;

  public String toString() {
  	return result.toString();// + " - " + description;
  }
}

class Result {
  public String description;
  public String container;
  public String naviaddress;
  public List<CoverImage> cover;

  public String toString() {
  	String s = "Address:";
  	s += "[" + container + "]" + naviaddress + " - " + description + "\n";
  	s += "Images:\n";
  	for(int i=0;i<cover.size();i++) {
  		s += Integer.toString(i)+": "+cover.get(i).toString() + "\n";
  	}
  	return s;
  }
}

class CoverImage {
  public String image;
  public String toString() {
  	return image;
  }
}
Теперь закомментируем вывод строки с объектом на печать - нам она больше не понадобится - мы будем выводить уже структурированные данные.
			// Печать результатов
			// System.out.println(jsonString);
Программа практически готова. Нам осталось только преобразовать полученную ранее строку jsonString в объект класса Response. Это мы произведем с помощью метода fromJson() библиотеки Gson.

В завершение выведем на печать полученный объект.
			Gson gson = new Gson();
			Response response = gson.fromJson(jsonString, Response.class);

			System.out.println(response.toString());
Так как мы используем библиотеку Gson нам потребуется изменить немного параметры компилятора Java и интерпретатора JVM. Для этого мы добавим параметр -cp (или -classpath) в командную строку.
> javac -cp gson-2.8.5.jar:. Jnavi.java
> java -cp gson-2.8.5.jar:. Jnavi
Если мы все сделали правильно, то должны получить полную информацию о заданном навиадресе:
  • его контейнер и адрес
  • название
  • список URL изображений обложки
На выходе мы должны получить вот такой вот текст, содержащий информацию из заданного адреса:
Address:7495 - Office Naviaddress.ru
Images:
0: https://navi-images.s3.eu-west-3.amazonaws.com/uploads/images2/1616/large_OPWKWILRLD.png
1: https://navi-images.s3.eu-west-3.amazonaws.com/uploads/images2/1616/large_DOJWEQWRZZ.png
2: https://navi-images.s3.eu-west-3.amazonaws.com/uploads/images2/1616/large_CDOPDXPCRQ.png
Полный текст программы Jnavi.java можно скачать по ссылке.

Для работы программы потребуется библиотека Gson, которую можно скачать по ссылке.

Автор: А.Гершун (12.09.2018)
Made on
Tilda