как взять пользовательские репозитории с нескольких страниц github

#java #json #github-api

#java #json #github-api

Вопрос:

Вот мой код.

  1. Могу ли я как-то указать URL, чтобы программа проверяла все сайты с репозиториями? Дело в том, что я хочу, чтобы данные со страницы = 1, страницы = 2, страницы = 3 загружались одновременно. Может быть, есть общая форма для всех страниц?
  2. На страницах 1 и 2 есть 30 репозиториев, а моя программа со страниц 1 и 2 загружает только 29. Со страницы 3 иногда 5, иногда 6 репозиториев, но есть 6 репозиториев. Почему?

открытый класс Main {

 public static void main(String[] args) throws Exception {

    String url = "https://api.github.com/users/allegro/repos?pagelen=30amp;page=1";
    String data = readUrl(url);
    JSONArray jsonArr = new JSONArray(data);

    for (int i = 0; i < jsonArr.length(); i  ) {
        JSONObject jsonObj = jsonArr.getJSONObject(i);

        System.out.println(jsonObj.get("name")   " : "   jsonObj.get("updated_at"));
    }
}
private static String readUrl(String urlString) throws Exception {
    BufferedReader reader = null;
    try {
        URL url = new URL(urlString);
        reader = new BufferedReader(new InputStreamReader(url.openStream()));
        StringBuffer buffer = new StringBuffer();
        int read;
        char[] chars = new char[1024];
        while ((read = reader.read(chars)) != -1)
            buffer.append(chars, 0, read);

        return buffer.toString();
    } finally {
        if (reader != null)
            reader.close();
    }
}
 

}

РЕДАКТИРОВАТЬ С помощью этого приложения lines я возвращаю 65 из 66 репозиториев.

     String url1 = "https://api.github.com/users/allegro/repos?pagelen=1000";
    String url2 = "https://api.github.com/users/allegro/repos?pagelen=1000amp;page=2";
    String url3 = "https://api.github.com/users/allegro/repos?pagelen=1000amp;page=3";

    String data1 = readUrl(url1);
    String data2 = readUrl(url2);
    String data3 = readUrl(url3);

    JSONArray jsonArr1 = new JSONArray(data1);
    JSONArray jsonArr2 = new JSONArray(data2);
    JSONArray jsonArr3 = new JSONArray(data3);


    for (int i = 0; i < jsonArr1.length(); i  ) {
        JSONObject jsonObj = jsonArr1.getJSONObject(i);

        System.out.println(jsonObj.get("name")   " : "   jsonObj.get("updated_at"));
    }
    for (int i = 0; i < jsonArr2.length(); i  ) {
        JSONObject jsonObj = jsonArr2.getJSONObject(i);

        System.out.println(jsonObj.get("name")   " : "   jsonObj.get("updated_at"));
    }
    for (int i = 0; i < jsonArr3.length(); i  ) {
        JSONObject jsonObj = jsonArr3.getJSONObject(i);

        System.out.println(jsonObj.get("name")   " : "   jsonObj.get("updated_at"));
    }
 

Комментарии:

1. что происходит, когда вы увеличиваете параметр запроса pagelen до очень большого числа, например pagelen=1000

2. ничего, все время возвращает результат 29/30 репозиториев с первой страницы

Ответ №1:

Поисковые запросы Github, возвращающие несколько элементов, по умолчанию будут разбиты на страницы до 30 элементов. В большинстве случаев вы можете увеличить количество элементов на странице максимум до 100, используя ?per_page параметр. Таким образом , ваш URL — адрес поискового запроса должен быть https://api.github.com/users/allegro/repos?per_page=100amp;page=page_no следующим . Смотрите разбивку на страницы в Github .