我有一个运行在9091端口上的browsermob代理。我正在尝试使用browsermob-proxy REST API来设置自定义头。当我通过代理使用Selenium向我的应用程序发出请求时,我看不到应用程序控制台中打印的标题。下面是我的代码。请求主体基于此处的文档。我的要求是使用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-设置并覆盖HTTP请求标头。例如,设置自定义用户代理。有效负载数据应为json编码的标头集(不是url编码的)