[转]Android-网络通信框架Volley使用详解
1 Volley发送get请求:
- public void getJson() {
- String url = "http://"+host+":8080/web/json.jsp?username=xjs&password=123456";
- mQueue.add(new JsonObjectRequest(Method.GET, url, null,
- new Listener<JSONObject>() {
- @Override
- public void onResponse(JSONObject response) {
- Log.e(TAG, "response : " + response.toString());
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- String err = error.getMessage();
- Log.e(TAG, "err : " + err);
- }
- }));
- }
2 Volley发送post请求:
- 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获取网络图片:
- 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请求,需要修改源码:
- 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,需要修改源码:
- @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():
- @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:
- 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设置请求超时时间:
- @Override
- public RetryPolicy getRetryPolicy() {
- RetryPolicyretryPolicy = new DefaultRetryPolicy(5000,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
- returnretryPolicy;
- }
如果是用这种方式上传post参数:
- 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中再取值。
附一个登陆铁道部12306的例子,源码在:http://download.csdn.net/download/goldenfish1919/7029907
Ps:我在测试的时候用了本地的一个tomcat,一块打包放在了asserts下面。
参考:
http://blog.csdn.net/xyz_lmn/article/details/12165391
http://blog.csdn.net/xyz_lmn/article/details/12746581
http://blog.csdn.net/xyz_lmn/article/details/12177005
http://www.itsalif.info/content/android-volley-tutorial-http-get-post-put
概述:http://blog.csdn.net/t12x3456/article/details/9221611
入门: http://blog.csdn.net/ttdevs/article/details/17566795
自定义request: http://blog.csdn.net/ttdevs/article/details/17586205
源码分析:http://blog.csdn.net/ttdevs/article/details/17764351
发送https请求:http://blog.csdn.net/llwdslal/article/details/18052723
构造cache:http://stackoverflow.com/questions/16682595/android-volley-imageloader-bitmaplrucache-parameter
解析服务端cookie:http://stackoverflow.com/questions/20702178/android-volley-access-http-response-header-fields,http://blog.csdn.net/hpb21/article/details/12163371
上传cookie:http://stackoverflow.com/questions/17049473/how-to-set-custom-header-in-volley-request
设置超时:http://stackoverflow.com/questions/17094718/android-volley-timeout
http://blog.csdn.net/dacainiao007/article/details/12617747,这里关于超时时间增长的因子的说法不准确,应该是当第一次连接超时以后,第二次超时时间会变为原来的多少倍,连接超时和读取超时设置为同一个数。
[转]Android-网络通信框架Volley使用详解的更多相关文章
- Android 网络通信框架Volley简介(Google IO 2013)
1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient( ...
- [转]Android 网络通信框架Volley简介(Google IO 2013)
Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...
- 【转】Android 网络通信框架Volley简介(Google IO 2013)
Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...
- Android 网络通信框架Volley(一)
转自:http://blog.csdn.net/t12x3456/article/details/9221611 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫 ...
- Android 网络通信框架Volley的简单使用
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. Volley提供的功能: JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 ...
- Android 网络通信框架Volley简介
1.1. Volley引入的背景在以前,我们可能面临如下很多麻烦的问题. 比如以前从网上下载图片的步骤可能是这样的流程: 在ListAdapter#getView()里开始图像的读取. 通过Async ...
- Android 网络通信框架Volley基本介绍
Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...
- Android 网络通信框架Volley(二)
Volley提供2个静态方法: public static RequestQueue newRequestQueue(Context context) {} public static Request ...
- Android 网络通信框架Volley(三)
NetworkImageView 分析:public class NetworkImageView extends ImageView 他继承自ImageView,并且添加了一个新方法: public ...
随机推荐
- 匹配不含有某个信息的sql语句写法
SELECT id,order_id,flight_info FROM order_flights WHERE mark=0 AND flight_info REGEXP '[^() DAY)]' O ...
- 【sql】经典SQL语句大全
原文链接:http://www.cnblogs.com/yubinfeng/archive/2010/11/02/1867386.html —————————————————————————————— ...
- char * 和 void *
POSIX.1 将 read函数的原型做了修改,经典的定义为 int read(int filedes, char *buf, unsigned nbytes); 修改为 ssize_t read(i ...
- 武汉科技大学ACM :1008: 华科版C语言程序设计教程(第二版)习题6.14
Problem Description 输入一个八进制的字符串,将它转换成等价的十进制字符串,用pringf的%s格式输出. Input 首先输入一个正整数t,表示有t组测试数据(1<= t & ...
- union关键字 与大小端模式
union 关键字(主要用来压缩空间,如果一些数据不可能同一时间同时用到,可是考虑使用union) union关键字声明的变量称之为联合体变量: (1)联合体变量只配置一个足够大的空间来容纳最大长度的 ...
- InnoDB概览
InnoDB 采用了MVCC来支持高并发,并且实现了四个标准的隔离级别.其默认级别是REPEATABLE READ(可重复读) ,并且,通过间隙锁(next-key locking)策略防止幻读的出现 ...
- Mysql 锁粒度
表锁: 表锁是mysql 中最几本的锁策略,并且是开销最小的策略:它会锁定整张表. 一个用户在对表进行锁操作(增,删,改)前,首先要获得写锁,这会阻塞其他用户对该表的所有读写操作.只有没有写锁时,其他 ...
- Remoting通讯实例
Remoting通讯可以实现不同应用程序域之间的通信(可以为一台机器不同程序,也可以不同机器上的不同程序) 实例步骤: (1)编写透明代理类 新建一个类库,命名空间:MyRemoting 在该类库中建 ...
- UCOS 请求任务删除函数 及其应用
有时候,如果任务A拥有内存缓冲区或信号量之类的资源,而任务B想删除该任务,这些资源就可能由于没被释放而丢失.在这种情况下,用户可以想法子让拥有这些资源的任务在使用完资源后,先释放资源,再删除自己.用户 ...
- 信息安全实验三:privilege-separation
title: privilege-separation date: 2016-01-12 14:40:04 categories: tags: --- Exercise1 In order to ga ...