Android应用层(网络编程)二(HttpClient、HttpURLConnection)
来源:互联网 发布:北风网大数据 编辑:程序博客网 时间:2024/06/06 12:31
HttpClient与HttpURLConnection
1.HttpClient
Android SDK中包含了HttpClient,在Android6.0版本直接删除了HttpClient类库,如果仍想使用则解决方法是:
- 如果使用的是eclipse则在libs中加入org.apache.http.legacy.jar这个jar包在:**sdk\platforms\android-23\optional目录中(需要下载android
6.0的SDK)
- 如果使用的是android studio则 在相应的module下的build.gradle中加入:
android { useLibrary 'org.apache.http.legacy' }
1.1 HttpClient的GET请求
Step 1 : 用DefaultHttpClient类来实例化一个HttpClient,并配置好默认的请求参数
//创建HttpClient private HttpClient createHttpClient() { HttpParams mDefaultHttpParams = new BasicHttpParams(); //设置连接超时 HttpConnectionParams.setConnectionTimeout(mDefaultHttpParams, 15000); //设置请求超时 HttpConnectionParams.setSoTimeout(mDefaultHttpParams, 15000); HttpConnectionParams.setTcpNoDelay(mDefaultHttpParams, true); HttpProtocolParams.setVersion(mDefaultHttpParams, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(mDefaultHttpParams, HTTP.UTF_8); //持续握手 HttpProtocolParams.setUseExpectContinue(mDefaultHttpParams, true); HttpClient mHttpClient = new DefaultHttpClient(mDefaultHttpParams); return mHttpClient; }
Step 2 : 创建HttpGet和HttpClient,请求网络并得到HttpResponse,并对HttpResponse进行处理
private void useHttpClientGet(String url) { HttpGet mHttpGet = new HttpGet(url); mHttpGet.addHeader("Connection", "Keep-Alive"); try { HttpClient mHttpClient = createHttpClient(); HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet); HttpEntity mHttpEntity = mHttpResponse.getEntity(); int code = mHttpResponse.getStatusLine().getStatusCode(); if (null != mHttpEntity) { InputStream mInputStream = mHttpEntity.getContent(); String respose = converStreamToString(mInputStream); Log.i("wangshu", "请求状态码:" + code + "\n请求结果:\n" + respose); mInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } }
converStreamToString方法将请求结果转换成String类型:
private String converStreamToString(InputStream is) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuffer sb = new StringBuffer(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } String respose = sb.toString(); return respose; }
最后我们开启线程访问百度:
new Thread(new Runnable() { @Override public void run() { useHttpClientGet("http://www.baidu.com"); } }).start();
1.2 HttpClient的POST请求
post请求和get类似,就是需要配置要传递的参数:
private void useHttpClientPost(String url) { HttpPost mHttpPost = new HttpPost(url); mHttpPost.addHeader("Connection", "Keep-Alive"); try { HttpClient mHttpClient = createHttpClient(); List<NameValuePair> postParams = new ArrayList<>(); //要传递的参数 postParams.add(new BasicNameValuePair("username", "moon")); postParams.add(new BasicNameValuePair("password", "123")); mHttpPost.setEntity(new UrlEncodedFormEntity(postParams)); HttpResponse mHttpResponse = mHttpClient.execute(mHttpPost); HttpEntity mHttpEntity = mHttpResponse.getEntity(); int code = mHttpResponse.getStatusLine().getStatusCode(); if (null != mHttpEntity) { InputStream mInputStream = mHttpEntity.getContent(); String respose = converStreamToString(mInputStream); Log.i("wangshu", "请求状态码:" + code + "\n请求结果:\n" + respose); mInputStream.close(); } } catch (IOException e) { e.printStackTrace(); }}
2. HttpURLConnection
它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。另外在Android 6.0版本中,HttpClient库被移除了,HttpURLConnection则是以后我们唯一的选择。
2.1 HttpURLConnection的POST请求
Step 1 : 创建一个UrlConnManager类,提供getHttpURLConnection()方法用于配置默认的参数并返回HttpURLConnection
public static HttpURLConnection getHttpURLConnection(String url){ HttpURLConnection mHttpURLConnection=null; try { URL mUrl=new URL(url); mHttpURLConnection=(HttpURLConnection)mUrl.openConnection(); //设置链接超时时间 mHttpURLConnection.setConnectTimeout(15000); //设置读取超时时间 mHttpURLConnection.setReadTimeout(15000); //设置请求参数 mHttpURLConnection.setRequestMethod("POST"); //添加Header mHttpURLConnection.setRequestProperty("Connection","Keep-Alive"); //接收输入流 mHttpURLConnection.setDoInput(true); //传递参数时需要开启 mHttpURLConnection.setDoOutput(true); } catch (IOException e) { e.printStackTrace(); } return mHttpURLConnection ; } ```#### Step 2 : 在UrlConnManager类中再写一个postParams()方法用来组织一下请求参数并将请求参数写入到输出流中 ``` public static void postParams(OutputStream output,List<NameValuePair>paramsList) throws IOException{ StringBuilder mStringBuilder=new StringBuilder(); for (NameValuePair pair:paramsList){ if(!TextUtils.isEmpty(mStringBuilder)){ mStringBuilder.append("&"); } mStringBuilder.append(URLEncoder.encode(pair.getName(),"UTF-8")); mStringBuilder.append("="); mStringBuilder.append(URLEncoder.encode(pair.getValue(),"UTF-8")); } BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(output,"UTF-8")); writer.write(mStringBuilder.toString()); writer.flush(); writer.close(); }
Step 3 : 添加请求参数,调用postParams()方法将请求的参数组织好传给HttpURLConnection的输出流,请求连接并处理返回的结果
private void useHttpUrlConnectionPost(String url) { InputStream mInputStream = null; HttpURLConnection mHttpURLConnection = UrlConnManager.getHttpURLConnection(url); try { List<NameValuePair> postParams = new ArrayList<>(); //要传递的参数 postParams.add(new BasicNameValuePair("username", "moon")); postParams.add(new BasicNameValuePair("password", "123")); UrlConnManager.postParams(mHttpURLConnection.getOutputStream(), postParams); mHttpURLConnection.connect(); mInputStream = mHttpURLConnection.getInputStream(); int code = mHttpURLConnection.getResponseCode(); String respose = converStreamToString(mInputStream); Log.i("wangshu", "请求状态码:" + code + "\n请求结果:\n" + respose); mInputStream.close(); } catch (IOException e) { e.printStackTrace(); } }
Step 4 : 开启线程请求网络
private void useHttpUrlConnectionGetThread() { new Thread(new Runnable() { @Override public void run() { useHttpUrlConnectionPost("http://www.baidu.com"); } }).start(); }
报504错误,读取响应的数据报错,对于我们这次请求服务端不能返回完整的响应,返回的数据为0 bytes,所以mHttpURLConnection.getInputStream() 也读不到服务端响应的输入流。当然这次错误是正常的,百度没理由处理我们的这次POST请求。
阅读全文
0 0
- Android应用层(网络编程)二(HttpClient、HttpURLConnection)
- android网络应用(二)——HttpURLConnection和HttpClient
- Android网络编程(二)HttpClient与HttpURLConnection
- Android网络编程(二)HttpClient与HttpURLConnection
- 【收藏用】切勿转载--Android网络编程(二)HttpClient与HttpURLConnection
- Android 网络编程(2): HttpClient与HttpURLConnection
- Android网络编程(二)HttpURLConnection
- Android网络编程(二)HttpClient
- android网络编程 二(Apache HttpClient)
- Android 网络编程(二)HttpClient
- 网络<二>httpclient /httpURLConnection
- Android网络编程 HttpUrlConnection HttpClient AsyncTask
- Android网络编程之HttpUrlConnection、HttpClient
- Android网络编程HttpClient和HttpUrlConnection
- Android网络编程 HttpURLConnection,HttpClient,Asynchttpclient使用
- Android之网络编程(二)使用 HttpURLConnection
- 网络请求(HttpUrlConnection/HttpClient)
- Android应用层(网络编程)一
- DEFAULT_THREAD_STACKSIZE影响其它任务运行
- javaWeb实现分页
- fastjson 使用方法
- [iOS]应用内支付(内购)的个人开发过程及坑!
- Android 图片轮播效果,RollViewPager的简单使用
- Android应用层(网络编程)二(HttpClient、HttpURLConnection)
- mysql 查询结果 自定义列名
- zigbee 节点退出网络 NLME_LeaveReq()
- Android Studio将library手动打成jar包
- UE4 VR 瞬移 Teleport 一
- 网易2017内推笔试程序题
- linux网络编程常用头文件
- 在线编译器地址
- 【《Unity着色器和屏幕特效开发秘笈》】学习整理:第二章(1)