我是Volley Networking Library(Android版)的新手。我观察到Request函数将URL作为参数而不是服务器名称和端口。如果我提到服务器名称和端口,有没有办法让Volley请求通过我选择的代理服务器?
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
我知道我们可以在构建URL时使用服务器和端口信息,但除此之外还有其他方法可以确保请求通过我们提到的代理吗?
例如:How do I make HttpURLConnection use a proxy?这是确保HttpURLConnection使用代理的方法。我正在为Volley寻找类似的答案。
答案 0 :(得分:13)
Volley没有提供任何直接设置代理的方法,但有一种方法。
创建一个扩展HurlStack的自定义类,比如说ProxiedHurlStack
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;
import com.android.volley.toolbox.HurlStack;
public class ProxiedHurlStack extends HurlStack {
@Override
protected HttpURLConnection createConnection(URL url) throws IOException {
// Start the connection by specifying a proxy server
Proxy proxy = new Proxy(Proxy.Type.HTTP,
InetSocketAddress.createUnresolved("192.168.1.11", 8118));//the proxy server(Can be your laptop ip or company proxy)
HttpURLConnection returnThis = (HttpURLConnection) url
.openConnection(proxy);
return returnThis;
}
}
现在使用以下命令初始化您的队列:
mRequestQueue = Volley.newRequestQueue(context, new ProxiedHurlStack());
答案 1 :(得分:5)
如果用户在系统级设置代理(例如,用于wifi连接的代理主机),那么您将无法在应用内明确知道该代理。为了解决这个问题,我还扩展了HurlStack以使用第一个配置的代理:
public class ProxyHurlStack extends HurlStack {
@Override
protected HttpURLConnection createConnection(URL url) throws IOException {
final HttpURLConnection urlConnection;
Proxy proxy = null;
try {
proxy = ProxySelector.getDefault().select(url.toURI()).get(0);
} catch (Exception e) {
Ln.e(e, e.getMessage());
}
if (proxy == null) {
urlConnection = (HttpURLConnection) url.openConnection();
} else {
urlConnection = (HttpURLConnection) url.openConnection(proxy);
}
return urlConnection;
}
}
答案 2 :(得分:1)
Justin Lee对这个问题有最好的答案。 首先,我担心ProxySelector会返回多个Proxy定义,但实际上,它只返回一个,即使返回类型是List。
@Override public List<Proxy> select(URI uri) {
return Collections.singletonList(selectOneProxy(uri));
}
private Proxy selectOneProxy(URI uri) {[...]
其次我认为使用用户系统进行疯狂设置将是一个很好的做法。为了可用性和动态代理配置。
有关select(java.net.URI)
方法的详细信息,请参阅here。
哦,顺便说一句,如果我是你,我会首先看到createConnection(java.net.Url)
的HurlStack实现。这是:
/**
* Create an {@link HttpURLConnection} for the specified {@code url}.
*/
protected HttpURLConnection createConnection(URL url) throws IOException {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Workaround for the M release HttpURLConnection not observing the
// HttpURLConnection.setFollowRedirects() property.
// https://code.google.com/p/android/issues/detail?id=194495
connection.setInstanceFollowRedirects(HttpURLConnection.getFollowRedirects());
return connection;
}
看那些评论......