【安卓笔记】android客户端与服务端交互的三种方式
16lz
2021-12-04
android客户端向服务器通信一般有以下选择: 1.传统的java.net.HttpURLConnection类 2.apache的httpClient框架(已纳入android.jar中,可直接使用) 3.github上的开源框架async-http(基于httpClient) ---------------------------------------------------------------------------------- 下面分别记录这三种方式的使用,以后忘了就来看看~ 下面开始贴代码
传统方式:
传统方式:
/** * 以get方式向服务端发送请求,并将服务端的响应结果以字符串方式返回。如果没有响应内容则返回空字符串 * * @param url 请求的url地址 * @param params 请求参数 * @param charset url编码采用的码表 * @return */ public static String getDataByGet(String url,Map<String,String> params,String charset) { if(url == null) { return ""; } url = url.trim(); URL targetUrl = null; try { if(params == null) { targetUrl = new URL(url); } else { StringBuilder sb = new StringBuilder(url+"?"); for(Map.Entry<String,String> me : params.entrySet()) {// 解决请求参数中含有中文导致乱码问题 sb.append(me.getKey()).append("=").append(URLEncoder.encode(me.getValue(),charset)).append("&"); } sb.deleteCharAt(sb.length()-1); targetUrl = new URL(sb.toString()); } Log.i(TAG,"get:url----->"+targetUrl.toString());//打印log HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection(); conn.setConnectTimeout(3000); conn.setRequestMethod("GET"); conn.setDoInput(true); int responseCode = conn.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK) { return stream2String(conn.getInputStream(),charset); } } catch (Exception e) { Log.i(TAG,e.getMessage()); } return "";/** * 以post方式向服务端发送请求,并将服务端的响应结果以字符串方式返回。如果没有响应内容则返回空字符串 * @param url 请求的url地址 * @param params 请求参数 * @param charset url编码采用的码表 * @return */ public static String getDataByPost(String url,Map<String,String> params,String charset) { if(url == null) { return ""; } url = url.trim(); URL targetUrl = null; OutputStream out = null; try { targetUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection(); conn.setConnectTimeout(3000); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); StringBuilder sb = new StringBuilder(); if(params!=null && !params.isEmpty()) { for(Map.Entry<String,String> me : params.entrySet()) {// 对请求数据中的中文进行编码 sb.append(me.getKey()).append("=").append(URLEncoder.encode(me.getValue(),charset)).append("&"); } sb.deleteCharAt(sb.length()-1); } byte[] data = sb.toString().getBytes(); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(data.length)); out = conn.getOutputStream(); out.write(data); Log.i(TAG,"post:url----->"+targetUrl.toString());//打印log int responseCode = conn.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK) { return stream2String(conn.getInputStream(),charset); } } catch (Exception e) { Log.i(TAG,e.getMessage()); } return ""; }/** * 将输入流对象中的数据输出到字符串中返回 * @param in * @return * @throws IOException */ private static String stream2String(InputStream in,String charset) throws IOException { if(in == null) return ""; byte[] buffer = new byte[1024]; ByteArrayOutputStream bout = new ByteArrayOutputStream(); int len = 0; while((len = in.read(buffer)) !=-1) { bout.write(buffer, 0, len); } String result = new String(bout.toByteArray(),charset); in.close(); return result; }使用httpClient:
package cn.edu.chd.httpclientdemo.http;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.URLEncoder;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.StatusLine;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import android.util.Log;/** * @author Rowand jj * *http工具类,发送get/post请求 */public final class HttpUtils{ private static final String TAG = "HttpUtils"; private static final String CHARSET = "utf-8"; private HttpUtils(){} /** * 以get方式向指定url发送请求,将响应结果以字符串方式返回 * @param uri * @return 如果没有响应数据返回null */ public static String requestByGet(String url,Map<String,String> data) { if(url == null) return null;// 构建默认http客户端对象 HttpClient client = new DefaultHttpClient(); try {// 拼装url,并对中文进行编码 StringBuilder sb = new StringBuilder(url+"?"); if(data != null) { for(Map.Entry<String,String> me : data.entrySet()) { sb.append(URLEncoder.encode(me.getKey(),CHARSET)).append("=").append(URLEncoder.encode(me.getValue(),"utf-8")).append("&"); } sb.deleteCharAt(sb.length()-1); } Log.i(TAG, "[get]--->uri:"+sb.toString());// 创建一个get请求 HttpGet get = new HttpGet(sb.toString());// 执行get请求,获取http响应 HttpResponse response = client.execute(get);// 获取响应状态行 StatusLine statusLine = response.getStatusLine(); //请求成功 if(statusLine != null && statusLine.getStatusCode() == 200) {// 获取响应实体 HttpEntity entity = response.getEntity(); if(entity != null) { return readInputStream(entity.getContent()); } } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 以post方式向指定url发送请求,将响应结果以字符串方式返回 * @param url * @param data 以键值对形式表示的信息 * @return */ public static String requestByPost(String url,Map<String,String> data) { if(url == null) return null; HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(url); List<NameValuePair> params = null; try { Log.i(TAG, "[post]--->uri:"+url); params = new ArrayList<NameValuePair>(); if(data != null) { for(Map.Entry<String,String> me : data.entrySet()) { params.add(new BasicNameValuePair(me.getKey(),me.getValue())); } }// 设置请求实体 post.setEntity(new UrlEncodedFormEntity(params,CHARSET));// 获取响应信息 HttpResponse response = client.execute(post); StatusLine statusLine = response.getStatusLine(); if(statusLine!=null && statusLine.getStatusCode()==200) { HttpEntity entity = response.getEntity(); if(entity!=null) { return readInputStream(entity.getContent()); } } } catch (Exception e) { e.printStackTrace(); } return null; } /** * 将流中的数据写入字符串返回 * @param is * @return * @throws IOException */ private static String readInputStream(InputStream is) throws IOException { if(is == null) return null; ByteArrayOutputStream bout = new ByteArrayOutputStream(); int len = 0; byte[] buf = new byte[1024]; while((len = is.read(buf))!=-1) { bout.write(buf, 0, len); } is.close(); return new String(bout.toByteArray()); } /** * 将流中的数据写入字符串返回,以指定的编码格式 * 【如果服务端返回的编码不是utf-8,可以使用此方法,将返回结果以指定编码格式写入字符串】 * @param is * @return * @throws IOException */ private static String readInputStream(InputStream is,String charset) throws IOException { if(is == null) return null; ByteArrayOutputStream bout = new ByteArrayOutputStream(); int len = 0; byte[] buf = new byte[1024]; while((len = is.read(buf))!=-1) { bout.write(buf, 0, len); } is.close(); return new String(bout.toByteArray(),charset); }}3.使用async-http框架,这个如果使用的话需要导入框架的jar包或者把源码拷到工程下: 这个框架的好处是每次请求会开辟子线程,不会抛networkonmainthread异常,另外处理器类继承了Handler类,所以可以在里面更改UI。 注:这里使用的是最新的1.4.4版。 ·
/** * 使用异步http框架发送get请求 * @param path get路径,中文参数需要编码(URLEncoder.encode) */ public void doGet(String path) { AsyncHttpClient httpClient = new AsyncHttpClient(); httpClient.get(path, new AsyncHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { if(statusCode == 200) { try {// 此处应该根据服务端的编码格式进行编码,否则会乱码 tv_show.setText(new String(responseBody,"utf-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } }); } /** * 使用异步http框架发送get请求 * @param path */ public void doPost(String path) { AsyncHttpClient httpClient = new AsyncHttpClient(); RequestParams params = new RequestParams(); params.put("paper","中文");//value可以是流、文件、对象等其他类型,很强大!! httpClient.post(path, params, new AsyncHttpResponseHandler(){ @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { if(statusCode == 200) { tv_show.setText(new String(responseBody)); } } }); }上面那个tv_show是一个TextView控件。
更多相关文章
- android touch事件解析
- Android中onContextItemSelected不响应
- Android(安卓)startActivityForResult的使用
- android三级联动、四级联动(地区选择)
- 13-7-13如何修改android的title
- Android(安卓)返回键连续点击两次退出应用
- 安卓9.0 http请求数据失败解决办法
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和on
- Android(安卓)中与 Touch 事件分发和消费机制