You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:46:26