Java API для рейтинга BGP - PullRequest
       38

Java API для рейтинга BGP

0 голосов
/ 08 февраля 2019

Я пытаюсь набрать URL ранжирования bgp, но получаю html-страницу как вывод , я хочу получить данные json на этой hmtl-странице .Как мы можем получить JSON данных .

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

это URL рейтинга BGP: https://bgp.he.net

Контроллер

@RestController
@RequestMapping(value = "/api/bgp")
public class BGPController {

    @Autowired
    BGPService bgpService;

    @RequestMapping(value = "/getInfoById/{query}", method = RequestMethod.POST)
    protected @ResponseBody Map<String, Object> getAllJobs(@PathVariable(value = "query") String query) {
    Map<String, Object> dataMap = new HashMap<String, Object>();
    try {
        dataMap.put("status", true);
        dataMap.put("result", bgpService.getRanking(query));
    } catch (Exception e) {
        dataMap.put("status", false);
        dataMap.put("reason", e.getMessage());
        System.err.println("exception at bgp: ");
        e.printStackTrace();
    }
    System.out.println("dataMap: " + dataMap.toString());
    return dataMap;
    }
}

Реализация услуги

@Service
@Component
public class BGPServiceImpl implements BGPService {

    static CloseableHttpClient httpClient = HttpClients.createDefault();
    HttpGet getRequest = null;
    CloseableHttpResponse response = null;
    BufferedReader br = null;
    String stringJson = null;
    StringEntity stringEntity = null;
    String output = null;

    String URL = "https://bgp.he.net/";

    @Override
    public Map<String, Object> getRanking(String query) {

        Map<String, Object> dataMap = new HashMap<>();
        try {
            getRequest = new HttpGet(URL  + query);
            response = httpClient.execute(getRequest);
            br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())));
            String responseContent = "";
            while ((output = br.readLine()) != null) {
            responseContent += output;
            }
            if (response.getStatusLine().getStatusCode() == 200) {
            dataMap.put("status", "success");
            dataMap.put("rawData", responseContent);
            } else {
            dataMap.put("status", "failure");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
            br.close();
            } catch (Exception e) {
            e.printStackTrace();
            }
        }
        System.out.println("dataMap: " + dataMap);
        return dataMap;
    }

}

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я думаю, что есть три основных шага.

Первый, Запрос HTML-страницы с подключением https, какой бы инструмент вы не знали, например, класс httpsurlconnection и т. Д.

Второй, вы должны найти ключевое слово на html-странице, а затем проанализировать его с ключом с помощью библиотеки jsoup.

Наконец, вы можете использовать библиотеку json и получить строку json сЛитт усилий.

Например, на первой странице сайта

я могу найти ключевое слово, 'tabdata' после поиска исходного кода HTML.

Остальной процесс проходит гладко.

Вот мой пример для вас.

Сначала , я должен пропустить этот шаг, потому что у вас уже есть собственное решение.

Второй , класс JSoupParser, который извлекает содержимое с ключевым словом

static class JSoupParser {
    public String getWelcomeBGP(final String htmlcontents) {
        StringBuilder stbuld = new StringBuilder();
        Document doc = Jsoup.parseBodyFragment(htmlcontents);

        for (Element div : doc.select("div")) {
            int i = 0; 
            if(div.className().equals("tabdata"))
            {
                for (Element subdiv : div.select("div")) {
                    if(i != 0)
                        if(!subdiv.text().equals(""))
                            stbuld.append(subdiv.text()).append("\n");
                    i++;
                }
            }
        }

        return stbuld.toString();
    }
}

, наконец, класс JsonParser для генерации строки json из содержимого.

static class JsonParser {
    public JSONObject getWelcomeBGP(final String contents) throws IOException {
        BufferedReader breader = new BufferedReader(new StringReader(contents));
        String line= null;
        JSONObject jobj = new JSONObject();
        int id = 0;
        while((line = breader.readLine()) != null)
        {
            jobj.put("A" + id++, line);
        }

        return jobj;
    }

}

ЗдесьМой основной метод.

import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public static void main(String[] args) {
    // first, request html contents from the site.
    HttpsClientWithoutValidation htmlContents = new HttpsClientWithoutValidation();
    final String url = "https://bgp.he.net";
    String response = htmlContents.requestHtmlContents(url);

    // second, request html contents from the site.
    JSoupParser htmlparser = new JSoupParser();
    String contents = htmlparser.getWelcomeBGP(response);

    // finally, make your own json string or object whatever.
    JSONObject jobj = null;
    JsonParser jsonparser = new JsonParser();
    try {
        jobj = jsonparser.getWelcomeBGP(contents);
        System.out.println(jobj.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Хорошего дня.

0 голосов
/ 08 февраля 2019

но я получаю html-страницу как вывод, я хочу получить данные json на этой hmtl-странице

Вам необходимо проанализировать HTML Jsoup был бы полезенбиблиотека для этого.И тогда вы должны создать свой собственный JSON.

Однако , это окно поиска на сайте, похоже, не возвращает никаких результатов, поэтому я не уверен, что ваш код будет работать без каких-либо дополнительных усилий, таких как использование Selenium вместо

Используйте терминал, а не браузер, чтобы сначала протестировать ваш запрос.

$ curl -sL 'https://bgp.he.net/query'

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /query
on this server.</p>
<hr>
<address>Apache/2.4.7 (Ubuntu) Server at bgp.he.net Port 443</address>
</body></html>
...