Как сделать api запрос к stepik на java?
Необходимо получить информацию об определенном курсе на stepik используя api на java. Мне нужно сделать запрос так, чтобы получить список курсов, на которые открыта запись, вот json: https://stepic.org/api/courses?is_featured=true , как я понял можно взять все курсы и отфильтровать те, где enrollment: null , но может кто глянуть и с кодом помочь?
Ответы (1 шт):
Все достаточно просто. Будем использовать для десереализации json в объекты библиотеку Gson. Также я использую lombok для того, чтобы не писать геттеры, сеттеры и т.д. (вы можете писать, это на ваше усмотрение). По сути это все, что нам нужно. Класс Main выполняет запрос и передает его десереализатору, после чего результат выводится в консоль. Оставшиеся 3 класса - наши модели, в которые мы парсим результат. В классе Courses я объявил только 2 поля(их слишком много и скорее всего все вм и не нужны), поэтому только они попадают в результат. Допишите те поля, которые вам нужны.
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Main {
public static void main(String[] args) throws Exception {
ResponseStepic result = new Gson().fromJson(sendGet("https://stepic.org/api/courses?is_featured=true"), ResponseStepic.class);
System.out.println(result);
}
private static String sendGet(String url) throws Exception {
HttpURLConnection httpClient = (HttpURLConnection) new URL(url).openConnection();
httpClient.setRequestMethod("GET");
httpClient.setRequestProperty("User-Agent", "Mozilla/5.0");
try (BufferedReader in = new BufferedReader(new InputStreamReader(httpClient.getInputStream()))) {
final StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) response.append(line).append("\n");
return response.toString();
}
}
}
import java.util.List;
@lombok.Data
public class ResponseStepic {
private Meta meta;
private List<Courses> courses;
private List<Object> enrollments;
}
import com.google.gson.annotations.SerializedName;
@lombok.Data
class Meta {
private Integer page;
@SerializedName("hasPrevious")
private String has_previous;
@SerializedName("has_next")
private String hasNext;
}
@lombok.Data
public class Courses {
private Integer id;
private String summary;
}