如何使用Playwright-Java获取并替换API GET请求的查询参数
Playwright-Java 拦截并替换GET请求查询参数
一、获取查询字符串参数的方法
Playwright-Java的Request对象本身没有直接提供查询参数的解析方法,但可以通过解析请求URL来提取参数:
import java.net.URI; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import com.microsoft.playwright.Request; // 从Request对象提取查询参数 public Map<String, String> extractQueryParams(Request request) { Map<String, String> queryParams = new HashMap<>(); String url = request.url(); URI uri = URI.create(url); String query = uri.getQuery(); if (query == null) { return queryParams; } String[] pairs = query.split("&"); for (String pair : pairs) { int equalsIndex = pair.indexOf("="); String key = equalsIndex > 0 ? URLDecoder.decode(pair.substring(0, equalsIndex), StandardCharsets.UTF_8) : pair; String value = equalsIndex > 0 && pair.length() > equalsIndex + 1 ? URLDecoder.decode(pair.substring(equalsIndex + 1), StandardCharsets.UTF_8) : ""; queryParams.put(key, value); } return queryParams; }
调用这个方法即可拿到请求的所有查询参数键值对,方便后续修改操作。
二、拦截并替换查询参数的完整方案
如果需要修改查询参数后继续请求,不要使用page.onRequest(它仅作为事件监听,无法修改请求内容),应该使用page.route()方法,它支持拦截请求、修改参数后再发送:
import com.microsoft.playwright.Page; import com.microsoft.playwright.Route; import com.microsoft.playwright.Request; import com.microsoft.playwright.options.RouteContinueOptions; import java.net.URI; import java.net.URLEncoder; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; page.route("**/*", route -> { Request request = route.request(); // 仅处理GET请求 if ("GET".equals(request.method())) { URI originalUri = URI.create(request.url()); Map<String, String> queryParams = new HashMap<>(); // 1. 解析原查询参数 String originalQuery = originalUri.getQuery(); if (originalQuery != null) { String[] pairs = originalQuery.split("&"); for (String pair : pairs) { int equalsIndex = pair.indexOf("="); String key = equalsIndex > 0 ? URLDecoder.decode(pair.substring(0, equalsIndex), StandardCharsets.UTF_8) : pair; String value = equalsIndex > 0 && pair.length() > equalsIndex + 1 ? URLDecoder.decode(pair.substring(equalsIndex + 1), StandardCharsets.UTF_8) : ""; queryParams.put(key, value); } } // 2. 修改目标参数(示例:替换param1的值,新增newParam参数) queryParams.put("param1", "replaced_value"); queryParams.put("newParam", "new_value"); // 3. 构建新的查询字符串 StringBuilder newQueryBuilder = new StringBuilder(); for (Map.Entry<String, String> entry : queryParams.entrySet()) { if (newQueryBuilder.length() > 0) { newQueryBuilder.append("&"); } newQueryBuilder.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)) .append("=") .append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)); } String newQuery = newQueryBuilder.length() > 0 ? newQueryBuilder.toString() : null; // 4. 构建新URI并继续请求 URI newUri = new URI( originalUri.getScheme(), originalUri.getUserInfo(), originalUri.getHost(), originalUri.getPort(), originalUri.getPath(), newQuery, originalUri.getFragment() ); route.continueRoute(new RouteContinueOptions().setUrl(newUri.toString())); } else { // 非GET请求直接放行 route.continueRoute(); } });
关键说明
- 可以修改
page.route()的匹配规则(比如"https://example.com/api/**"),只拦截特定域名或路径的请求,提升运行效率。 - 解析和构建参数时必须做编码/解码处理,避免出现乱码或参数解析错误。
内容的提问来源于stack exchange,提问作者jba065
相关产品推荐
相关产品推荐

