使用:org.apache.http
我使用以下代码下载文件,大部分网址设置都是静态完成的,以便每次都保存创建对象。
private static final HttpClient httpClient;
static {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, false);
HttpConnectionParams.setConnectionTimeout(params, 10000);
HttpConnectionParams.setSoTimeout(params, 10000);
ConnManagerParams.setMaxTotalConnections(params, 100);
ConnManagerParams.setTimeout(params, 30000);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80)); //TODO port and schema should be coming from the strings file
ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
httpClient = new DefaultHttpClient(manager, params);
//httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 30000);
}
我可以使用
来调用它private HttpUrlRequest(String host, int port, String path, List<NameValuePair> query, List<NameValuePair> post)
我希望调用者能够为URL指定端口编号。但是因为
registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
是静态指定的,我不也要更改该端口号吗?我该如何解决这个问题?
答案 0 :(得分:3)
Scheme指定的端口是默认端口,不一定是实际连接中使用的端口。可以在每个请求URL中指定端口。例如,如果Scheme默认端口为80但请求URL为http://address.com:8080,则使用8080。如果未在URL中指定端口,则使用默认值。
答案 1 :(得分:1)
我猜测方案注册表是或者像HashMap一样工作。如果我是对的,你可以通过注册一组新的参数来改变(例如)http的方案。
因此,无论您在配置文件中读到什么内容,都可以重复调用
registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
使用不同的端口号。
问题:registry
是static
块中的局部变量。解决方案:做
static SchemeRegistry registry;
在你的static
块之外(最好是之前),这样你以后就可以访问变量err,class字段了。
要使这项工作,您还需要更改行
SchemeRegistry registry = new SchemeRegistry();
到
registry = new SchemeRegistry();
如果您想从其他课程进行注册更改,可以将registry
公开,或者为其提供静态访问者或其他内容。