首页 > 解决方案 > 从 https://enquiry.indianrail.gov.in/mntes 查询火车到达/出发

问题描述

我正在尝试通过使用 url(POST 方法)传递火车号和其他所需参数(从 web 开发人员工具-firefox 获得)来获取火车的停靠站(车站)列表,但我得到 404-page not found 错误代码。当我尝试使用 POSTMAN 时,它会获取包含请求数据的网页,代码有什么问题?

        Document doc= Jsoup.connect("https://enquiry.indianrail.gov.in/mntes/q?")
                .data("opt","TrainRunning")
                .data("subOpt","FindStationList")
                .data("trainNo",trainNumber)
                .data("jStation","")
                .data("jDate","25-Aug-2021")
                .data("jDateDay","Wed")
                .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0")
                .referrer("https://enquiry.indianrail.gov.in/mntes/")
                .ignoreHttpErrors(true)
                .post();
        System.out.println(doc.text());

邮递员的屏幕截图

先感谢您

标签: javajsoup

解决方案


我试图使请求与 Jsoup 一起工作,但无济于事。正在使用一种发送表单数据的奇怪方式。表单数据在 POST 请求中作为 URL 查询参数传递。

Jsoup 使用一个简化的 HTTP API,其中没有预见到这个特定的用例。以https://enquiry.indianrail.gov.in/mntes期望的方式发送表单参数是否合适是有争议的。

如果您使用的是 Java 11 或更高版本,则可以简单地通过现代Java HTTP Client获取 POST 请求的响应。它完全支持 HTTP 协议。然后,您可以将返回的String内容输入 Jsoup。

这是你可以做的:

// 1. Get the response
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://enquiry.indianrail.gov.in/mntes/q?opt=TrainRunning&subOpt=ShowRunC&trainNo=07482&jDate=25-Aug-2021&jDateDay=Wed&jStation=DVD%23false"))
    .POST(BodyPublishers.noBody())
    .build();
HttpResponse<String> response =
    client.send(request, BodyHandlers.ofString());

// 2. Parse the response via Jsoup
Document doc = Jsoup.parse(response.body());
System.out.println(doc.text());

我只是从 Postman 复制粘贴了正确的 URL。您可能希望以更健壮的方式构建查询字符串。看:


推荐阅读