Java 11:新的HTTP客户端使用x-www-form-urlencoded参数发送POST请求

2022-09-01 23:32:41

我正在尝试使用新的 http 客户端 API 发送 POST 请求。是否有内置的方式来发送格式化为?x-www-form-urlencoded

我当前的代码:

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .header("Content-Type", "application/x-www-form-urlencoded")
        .POST(BodyPublishers.ofString("a=get_account&account=" + URLEncoder.encode(account, "UTF-8")))
        .build();

我正在寻找一种更好的方法来传递参数。像这样:

Params p=new Params();
p.add("a","get_account");
p.add("account",account);

我需要自己构建此功能还是已经内置了某些功能?

我使用的是 Java 12。


答案 1

我认为以下是使用Java 11实现这一目标的最佳方法:

Map<String, String> parameters = new HashMap<>();
parameters.put("a", "get_account");
parameters.put("account", account);

String form = parameters.entrySet()
    .stream()
    .map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8))
    .collect(Collectors.joining("&"));

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(url))
    .headers("Content-Type", "application/x-www-form-urlencoded")
    .POST(HttpRequest.BodyPublishers.ofString(form))
    .build();

HttpResponse<?> response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.statusCode() + " " + response.body().toString());

答案 2

这种方式可能很有用:

String param = Map.of("param1", "value1", "param2", "value2")
      .entrySet()
      .stream()
      .map(entry -> Stream.of(
               URLEncoder.encode(entry.getKey(), UTF_8),
               URLEncoder.encode(entry.getValue(), UTF_8))
                .collect(Collectors.joining("="))
      ).collect(Collectors.joining("&"));

最多可以使用 10 对(参数、值)。它返回一个不可修改的地图。Map.of(...)


推荐