Java Github поиск в хранилище - PullRequest
1 голос
/ 20 марта 2019

Я делаю CLI-приложение на основе Java, в котором я могу искать в Github-репозитории и их последних тегах.Для этого я создал программу, которая вызывает Github API и фиксирует имя репозитория с наивысшими звездами и его владельца.Эта функциональность работает правильно, когда вы запускаете код ниже, он возвращает «cbeust».

Мой второй шаг - захватить последние теги, используя имя владельца и репозитория (url2), но когда я вызываю мою программу для захвата, она запускается, но не дает ожидаемого результата.

Пожалуйста, посмотрите намоя программа и дайте мне знать, что я делаю неправильно?

package com.github_search;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import com.jayway.jsonpath.JsonPath;
import org.apache.log4j.BasicConfigurator;
import org.json.JSONException;
import org.json.JSONObject;

public class github_search
{
    public static void main(String[] args) {
        try {
            BasicConfigurator.configure();
            String Name = "TESTNG";
            String Tags = "6.4.0";
            String url1 = "https://api.github.com/search/repositories?q="+ Name +"&sort=stars&order=desc";
            List<String> authors = JsonPath.read(github_search.search(url1).toString(), "$.items[*].owner.login");
            System.out.println("Owner: (" + authors.get(0) +")");
            String url2 = "https://api.github.com/repos/"+authors.get(0)+"/"+Name+"/tags";
            List<String> latest_tags = JsonPath.read(github_search.search(url2).toString(), "$..name");
            System.out.println("first tag: (" + latest_tags.get(0) +")");
        } catch (Exception e) {
            // TODO: handle exception
        }
    }

    public static String search(String url) throws IOException, JSONException {
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        JSONObject obj_JSONObject = new JSONObject(response.toString());
        return obj_JSONObject.toString();
    }
}

Текущий вывод

0 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath  - Evaluating path: $['items'][*]['owner']['login']
Owner: (cbeust)

Ожидаемый вывод

0 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath  - Evaluating path: $['items'][*]['owner']['login']
Owner: (cbeust)
first tag: (testng-6.9.5)

JSON-ответ на запрос тегов

[
  {
    "name": "testng-6.9.5",
    "zipball_url": "https://api.github.com/repos/cbeust/testng/zipball/testng-6.9.5",
    "tarball_url": "https://api.github.com/repos/cbeust/testng/tarball/testng-6.9.5",
    "commit": {
      "sha": "ef2d1199abff4e1b8fa4b1148c1314e776d7a044",
      "url": "https://api.github.com/repos/cbeust/testng/commits/ef2d1199abff4e1b8fa4b1148c1314e776d7a044"
    },
    "node_id": "MDM6UmVmNzQ1NzQ5OnRlc3RuZy02LjkuNQ=="
  },
  {
  ...
  }
]

1 Ответ

1 голос
/ 20 марта 2019

Проблема здесь в том, что ваш второй вызов search() вызывает исключение, вы проглатываете исключение в блоке перехвата, поэтому метод main завершается ошибкой и завершается, прежде чем он сможет распечатать latest_tags.get(0), следовательно, вы видите только выход из этого вызова: System.out.println(authors.get(0)).

Ответ на ваш первый вызов GitHub API выглядит следующим образом:

{
  "total_count": 6345,
  "incomplete_results": false,
  "items": [...]
}

Этот является единственным JSON-объектом, поэтому этот вызов успешен: new JSONObject(response.toString()).

Однако ответ на ваш второй вызов GitHub API выглядит следующим образом:

[
  {
    "name": "testng-6.9.5",
    "zipball_url": "https://api.github.com/repos/cbeust/testng/zipball/testng-6.9.5",
    "tarball_url": "https://api.github.com/repos/cbeust/testng/tarball/testng-6.9.5",
    "commit": {
      "sha": "ef2d1199abff4e1b8fa4b1148c1314e776d7a044",
      "url": "https://api.github.com/repos/cbeust/testng/commits/ef2d1199abff4e1b8fa4b1148c1314e776d7a044"
    },
    "node_id": "MDM6UmVmNzQ1NzQ5OnRlc3RuZy02LjkuNQ=="
  },
  ...
]

Итак, это массив «объектов» JSON (обратите внимание на то, как он заключен в квадратные скобки) и, следовательно, этот вызов: new JSONObject(response.toString()) завершается неудачно с ...

Value [...] of type org.json.JSONArray cannot be converted to JSONObject

Итак, это объясняет, почему вы видите только свой первый ожидаемый результат. Теперь, чтобы исправить проблему, вы можете просто заменить эти строки ...

JSONObject obj_JSONObject = new JSONObject(response.toString());
return obj_JSONObject.toString();

... с этим:

return response.toString()

И, для полноты, предоставьте некоторую реализацию в блоке catch в вашем методе main, чтобы вас не вводило в заблуждение проглоченное исключение.

...