【问题标题】:Sending a post request with payload in java在java中发送带有有效负载的发布请求
【发布时间】: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));

这将返回 html 代码,其中显示以下网站:

能得到答案真是太好了,因为我花了太多时间试图找出一种方法来解决这个问题(对上面的代码示例进行了多次迭代,但结果相同或更糟结果)。

以下是所需文件上 chrome 检查器的屏幕截图:

【问题讨论】:

  • 所以应该是: 1. 登录获取 access_token。 2 使用正文(如图所示)和 access_token(可能在标头中)发出 POST 请求,将响应保存到文件中。在 java 中使用 HTTP lib 时,此流程非常简单,放心是一个不错的选择。
  • @lucasnguyen17 好吧,我当然不知道如何登录网站并使用 java.net.http 进行发布请求,所以您能提供一个示例或教程吗?

标签: java selenium post httprequest


【解决方案1】:

错误说明了一切。 403 表示您无权使用POST。这意味着,您正在尝试创建一个没有Authorization 的资源。

您需要生成授权令牌并将其用于您的POST 请求。

请参考Http Basic Authentication in Java using HttpClient?

【讨论】:

  • 我尝试了您提供的问题中的代码,但它仍然在控制台中抛出以下 IOException:服务器返回 HTTP 响应代码:403 for URL:flow.polar.com/api/training/history。哦,如果我用谷歌尝试相同的代码,它会抛出:服务器返回 HTTP 响应代码:411 for URL:google.de/?hl=de
  • 您是否生成了有效的授权书?
  • 我不太清楚。我刚刚去了您提供的主题,复制了接受的答案,更改了网址并运行它。
  • 这是我提供的参考。您需要使用您的凭据生成授权令牌,然后将该令牌包含在您的 POST 请求中。
  • 我不知道如何生成授权令牌或如何将其包含在我的请求中。
猜你喜欢
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多