从 https://enquiry.indianrail.gov.in/mntes 查询火车 arrivals/departures

Query train arrivals/departures from 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());

提前致谢

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

Jsoup 使用简化的 HTTP API,其中未预见到此特定用例。 debatable whether it is appropriate to send form parameters the way https://enquiry.indianrail.gov.in/mntes 期待它们被发送。

如果您使用的是 Java 11 或更高版本,您可以简单地通过现代 Java HTTP 客户端[=获取 POST 请求的响应29=]。它完全支持 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。您可能希望以更稳健的方式构建查询字符串。参见:

  • Java URL encoding of query string parameters
  • How to convert map to url query string?