1 Volley發送get請求:java
[java] view plaincopyandroid
public void getJson() { web
String url = "http://"+host+":8080/web/json.jsp?username=xjs&password=123456"; json
mQueue.add(new JsonObjectRequest(Method.GET, url, null, cookie
new Listener<JSONObject>() { 網絡
@Override app
public void onResponse(JSONObject response) { dom
Log.e(TAG, "response : " + response.toString()); jsp
} ide
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
String err = error.getMessage();
Log.e(TAG, "err : " + err);
}
}));
}
2 Volley發送post請求:
[java] view plaincopy
public void postJson() {
String url = "http://"+host+":8080/web/json.jsp";
StringRequest postRequest = new StringRequest(
Request.Method.POST,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// response
Log.d("Response", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// error
Log.d("Error.Response", error.getMessage());
}
}) {
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("username", "xjs");
params.put("password", "123456");
return params;
}
};
mQueue.add(postRequest);
}
3 Volley獲取網絡圖片:
[java] view plaincopy
public void getImage() {
String imageUrl = "http://"+host+":8080/web/image.jsp";
NetworkImageView view = (NetworkImageView) findViewById(R.id.network_image_view);
view.setDefaultImageResId(android.R.drawable.ic_menu_rotate);
view.setErrorImageResId(android.R.drawable.ic_delete);
view.setImageUrl(imageUrl, new ImageLoader(mQueue, new BitmapLruCache(1024 * 4)));
}
4 Volley發送Https請求,須要修改源碼:
[java] view plaincopy
protected HttpURLConnection createConnection(URL url) throws IOException {
if (url.toString().toLowerCase(Locale.CHINA).startsWith("https")) {
HTTPSTrustManager.allowAllSSL();
}
return (HttpURLConnection) url.openConnection();
}
//HTTPSTrustManager.java:
public class HTTPSTrustManager implements X509TrustManager {
private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {
// To change body of implemented methods use File | Settings | File
// Templates.
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] x509Certificates, String s)
throws java.security.cert.CertificateException {
// To change body of implemented methods use File | Settings | File
// Templates.
}
public boolean isClientTrusted(X509Certificate[] chain) {
return true;
}
public boolean isServerTrusted(X509Certificate[] chain) {
return true;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return _AcceptedIssuers;
}
public static void allowAllSSL() {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
// TODO Auto-generated method stub
return true;
}
});
SSLContext context = null;
if (trustManagers == null) {
trustManagers = new TrustManager[] { new HTTPSTrustManager() };
}
try {
context = SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
}
}
5 Volley獲取服務端返回的cookie,須要修改源碼:
[java] view plaincopy
@Override
public HttpResponse performRequest(Request<?> request,Map<String, String> additionalHeaders)
throws IOException,AuthFailureError {
for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
if (header.getKey() != null) {
String key = header.getKey();
List<String> values = header.getValue();
if(key.equalsIgnoreCase("set-cookie")){
StringBuilder cookieString = new StringBuilder();
for(String value : values){
cookieString.append(value).append("\n");//用\n做爲分隔符,cookie中不該該有回車符號
}
cookieString.deleteCharAt(cookieString.length() - 1);
Header h = new BasicHeader(header.getKey(), cookieString.toString());
response.addHeader(h);
}else{
Header h = new BasicHeader(header.getKey(), values.get(0));
response.addHeader(h);
}
}
}
}
//而後再request中重寫parseNetworkResponse():
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
Response<String> superResponse = super.parseNetworkResponse(response);
Map<String, String> responseHeaders = response.headers;
String rawCookies = responseHeaders.get("Set-Cookie");
//服務端返回是 set-cookie:JSESSIONID=D90B58454550B4D37C4B66A76BF27B93; Path=/otn BIGipServerotn=2564030730.64545.0000; path=/
String part1 = substring(rawCookies, "", ";");
String part2 = substring(rawCookies, "\n", ";");
//客戶端須要的是 cookie:JSESSIONID=D90B58454550B4D37C4B66A76BF27B93; BIGipServerotn=2564030730.64545.0000;
cookies = part1 + "; " + part2 + ";";
return superResponse;
}
6 Volley發請求的時候上傳cookie,在request中重寫getHeaders():
[java] view plaincopy
@Override
public Map<String, String>getHeaders() throws AuthFailureError {
if(cookies!= null && cookies.length() > 0){
HashMap<String,String> headers = newHashMap<String, String>();
headers.put("Cookie",cookies);
returnheaders;
}
returnsuper.getHeaders();
}
7 Volley自定義request:
[java] view plaincopy
public class ByteArrayRequest extends Request<byte[]>{
private final Listener<byte[]> mListener;
public ByteArrayRequest(int method, String url, Listener<byte[]> listener, ErrorListener errlistener) {
super(method, url, errlistener);
mListener = listener;
}
@Override
protected Response<byte[]> parseNetworkResponse(NetworkResponse response) {
if(response == null){
return null;
}
if(response.statusCode != HttpStatus.SC_OK){
return null;
}
byte[] bytes = response.data;
return Response.success(bytes, null);
}
@Override
protected void deliverResponse(byte[] response) {
if(mListener != null){
mListener.onResponse(response);
}
}
}
8 Volley設置請求超時時間:
[java] view plaincopy
@Override
public RetryPolicy getRetryPolicy() {
RetryPolicyretryPolicy = new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
returnretryPolicy;
}
若是是用這種方式上傳post參數:
[java] view plaincopy
public void postJson() {
String url = "http://"+host+":8080/web/json.jsp";
HashMap<String, String> params = new HashMap<String, String>();
params.put("username", "xjs");
params.put("password", "123456");
JsonObjectRequest postRequest = new JsonObjectRequest(
Request.Method.POST,
url,
new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.e(TAG, "response : " + response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Error: ", error.getMessage());
}
});
mQueue.add(postRequest);
}
要注意,上傳的參數並非按照key-value拼接起來放在body中上傳的,而是按照json的形式上傳的,所以,服務端用request.getParameter("key")這種形式是沒法取出來value的,只能是request.getInputStream(),而後把整個的body還原出原來的json串,而後從json中再取值。