我有一个运行在端口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,而是使用了它。因此,我唯一需要进行的代码更改就是初始化代理的方式,其余部分相同。现在工作正常。
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 / [端口] /标头- 设置和覆盖HTTP请求标头。例如,设置自定义用户代理。有效载荷数据应为JSON编码的标头集(未经url编码)