java - 使用 BrowserMob-Proxy REST api 设置自定义 header

标签 java selenium proxy webdriver browsermob

我有一个在端口 9091 上运行的 browsermob 代理。我正在尝试使用 browsermob-proxy REST API 来设置自定义 header 。当我通过代理使用 Selenium 向我的应用程序发出请求时,我没有在我的应用程序控制台中看到 header 。下面是我的代码。请求正文基于文档 here .我的要求是针对此特定用例使用 BrowserMob 代理 API 而不是其 Java 库。我在下面的代码中做错了什么?

 Proxy proxy = new java.net.Proxy(java.net.Proxy.Type.HTTP, new InetSocketAddress("localhost", 9091));

 String bpmUrl = "http://localhost:8787/proxy/9091/interceptor/request";
 Client client = Client.create();
 String requestBody = "request.getMethod().addHeader(\"custom-header\", \"Bananabot/1.0\");";
 WebResource resource = client.resource(bpmUrl);
 resource.type(MediaType.TEXT_PLAIN_TYPE).post(requestBody);

 String url = "http://localhost:8004";
 DesiredCapabilities capabilities = DesiredCapabilities.firefox();
 capabilities.setCapability(CapabilityType.PROXY, proxy);
 WebDriver driver = new FirefoxDriver(capabilities);
 driver.get(url);
 driver.quit();

编辑 1

我尝试了@Erki 的解决方案,我认为它应该有效,但它不是。这里有什么遗漏吗?

 String bpmUrl = "http://localhost:8787/proxy/9091/headers";
     Map<String,String> data = new HashMap<String, String>();
     data.put("user-agent","Bananabot");
     ClientConfig cc = new DefaultClientConfig();
     cc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
     Client client = Client.create(cc);
     WebResource resource = client.resource(bpmUrl);
     resource.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, data);

编辑 2 找到了答案,我尝试了 Java API,它起作用并注意到浏览器正在按预期使用代理。使用我上面的代码,显然浏览器没有使用代理。因此,我没有使用 java.net.Proxy,而是使用了有效的 org.openqa.selenium.Proxy。所以我唯一需要的代码更改是初始化代理的方式,其余部分相同。这现在工作正常。

 String PROXY = "localhost:9091";
 Proxy proxy = new Proxy();
 proxy.setHttpProxy(PROXY);

最佳答案

您正在使用与在嵌入模式下使用 BMP 相对应的代码:

server.addRequestInterceptor(new RequestInterceptor() {
    @Override
    public void process(BrowserMobHttpRequest request, Har har) {
        request.getMethod().removeHeaders("User-Agent");
        request.getMethod().addHeader("User-Agent", "Bananabot/1.0");
    }
});

如果您实际上以嵌入式模式启动了代理服务器,那么这段代码就可以执行,据我所知,这不是您已经完成或打算执行的操作。您可能需要的是:

POST /proxy/[port]/headers - Set and override HTTP Request headers. For example setting a custom User-Agent. Payload data should be json encoded set of headers (not url-encoded)

关于java - 使用 BrowserMob-Proxy REST api 设置自定义 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594998/

相关文章:

使用java读取json文件时出现java.lang.ClassCastException : org. json.simple.JSONArray无法转换为org.json.simple.JSONObject错误

java - 如何使用按钮操作将字符串传递给类

linux - Cntlm 的本地配置文件

javascript - JS 代理拦截键和嵌套键不返回回退值

rest - TCP 打洞是否实用?

java - 如何在不重复代码的情况下编写子类构造函数?

scala - 使用空参数从Scala调用Java API

java - 将插件移至父 pom

c# - 在 Selenium 中为 Chrome 驱动程序设置代理

java - Selenium webdriver 可以附加到已经打开的浏览器窗口吗?