【发布时间】:2021-10-11 12:20:27
【问题描述】:
我需要获取一个文件的内容,这是我在网络选项卡下的 chromes 检查器中找到的。为此,我想向请求 URL 发送带有所需负载的发布请求。 由于我使用 Selenium ChromeDriver 导航和登录页面,我首先尝试使用 Selenium 提供的 HtmlRequest 类。但是几秒钟后我就卡住了,当时我不知道如何传递有效负载或一旦我最终完成了如何执行请求。由于我无法找到该类的正确解释或示例,因此我没有得到比以下代码更进一步的信息:
HttpRequest xhr = new HttpRequest(HttpMethod.POST, "https://flow.polar.com/api/training/history");
xhr.setContent(?);
接下来,我尝试使用 java.net.http 中的 HttpClient 类。我找到了以下示例并将 URL 更改为那个,chrome 检查器将我显示为请求 URL。
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://flow.polar.com/api/training/history")).build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
这返回了一个 html 站点,它只是告诉我,找不到我输入的 URL 的站点。
然后我尝试使用 Selenium 的 JavascriptExecutor 和以下代码:
JavascriptExecutor js = (JavascriptExecutor) driver;
System.out.println(js.executeScript("var xhr = new XMLHttpRequest();\r\n" +
"xhr.open('POST', 'https://flow.polar.com/api/training/history', false);\r\n" +
"xhr.setRequestHeader('XHR', 'application/x-www-form-urlencoded');\r\n" +
"\r\n" +
"xhr.send('login=test&password=test');\r\n" +
"return xhr.response;", (Object) null));
能得到答案真是太好了,因为我花了太多时间试图找出一种方法来解决这个问题(对上面的代码示例进行了多次迭代,但结果相同或更糟结果)。
【问题讨论】:
-
所以应该是: 1. 登录获取 access_token。 2 使用正文(如图所示)和 access_token(可能在标头中)发出 POST 请求,将响应保存到文件中。在 java 中使用 HTTP lib 时,此流程非常简单,放心是一个不错的选择。
-
@lucasnguyen17 好吧,我当然不知道如何登录网站并使用 java.net.http 进行发布请求,所以您能提供一个示例或教程吗?
标签: java selenium post httprequest