Android中的几种网络请求方式详解
16lz
2021-12-04
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看Android开发技巧总结中的Android单元测试的步骤一文。
java.net包中的HttpURLConnection类
Get方式:
view plain
- //Get方式请求
- publicstaticvoidrequestByGet()throwsException{
- Stringpath="https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
- //新建一个URL对象
- URLurl=newURL(path);
- //打开一个HttpURLConnection连接
- HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
- //设置连接超时时间
- urlConn.setConnectTimeout(5*1000);
- //开始连接
- urlConn.connect();
- //判断请求是否成功
- if(urlConn.getResponseCode()==HTTP_200){
- //获取返回的数据
- byte[]data=readStream(urlConn.getInputStream());
- Log.i(TAG_GET,"Get方式请求成功,返回数据如下:");
- Log.i(TAG_GET,newString(data,"UTF-8"));
- }else{
- Log.i(TAG_GET,"Get方式请求失败");
- }
- //关闭连接
- urlConn.disconnect();
- }
Post方式:
view plain
- //Post方式请求
- publicstaticvoidrequestByPost()throwsThrowable{
- Stringpath="https://reg.163.com/logins.jsp";
- //请求的参数转换为byte数组
- Stringparams="id="+URLEncoder.encode("helloworld","UTF-8")
- +"&pwd="+URLEncoder.encode("android","UTF-8");
- byte[]postData=params.getBytes();
- //新建一个URL对象
- URLurl=newURL(path);
- //打开一个HttpURLConnection连接
- HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
- //设置连接超时时间
- urlConn.setConnectTimeout(5*1000);
- //Post请求必须设置允许输出
- urlConn.setDoOutput(true);
- //Post请求不能使用缓存
- urlConn.setUseCaches(false);
- //设置为Post请求
- urlConn.setRequestMethod("POST");
- urlConn.setInstanceFollowRedirects(true);
- //配置请求Content-Type
- urlConn.setRequestProperty("Content-Type",
- "application/x-www-form-urlencode");
- //开始连接
- urlConn.connect();
- //发送请求参数
- DataOutputStreamdos=newDataOutputStream(urlConn.getOutputStream());
- dos.write(postData);
- dos.flush();
- dos.close();
- //判断请求是否成功
- if(urlConn.getResponseCode()==HTTP_200){
- //获取返回的数据
- byte[]data=readStream(urlConn.getInputStream());
- Log.i(TAG_POST,"Post请求方式成功,返回数据如下:");
- Log.i(TAG_POST,newString(data,"UTF-8"));
- }else{
- Log.i(TAG_POST,"Post方式请求失败");
- }
- }
org.apache.http包中的HttpGet和HttpPost类
Get方式:
view plain
- //HttpGet方式请求
- publicstaticvoidrequestByHttpGet()throwsException{
- Stringpath="https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
- //新建HttpGet对象
- HttpGethttpGet=newHttpGet(path);
- //获取HttpClient对象
- HttpClienthttpClient=newDefaultHttpClient();
- //获取HttpResponse实例
- HttpResponsehttpResp=httpClient.execute(httpGet);
- //判断是够请求成功
- if(httpResp.getStatusLine().getStatusCode()==HTTP_200){
- //获取返回的数据
- Stringresult=EntityUtils.toString(httpResp.getEntity(),"UTF-8");
- Log.i(TAG_HTTPGET,"HttpGet方式请求成功,返回数据如下:");
- Log.i(TAG_HTTPGET,result);
- }else{
- Log.i(TAG_HTTPGET,"HttpGet方式请求失败");
- }
- }
Post方式:
view plain
- //HttpPost方式请求
- publicstaticvoidrequestByHttpPost()throwsException{
- Stringpath="https://reg.163.com/logins.jsp";
- //新建HttpPost对象
- HttpPosthttpPost=newHttpPost(path);
- //Post参数
- List<NameValuePair>params=newArrayList<NameValuePair>();
- params.add(newBasicNameValuePair("id","helloworld"));
- params.add(newBasicNameValuePair("pwd","android"));
- //设置字符集
- HttpEntityentity=newUrlEncodedFormEntity(params,HTTP.UTF_8);
- //设置参数实体
- httpPost.setEntity(entity);
- //获取HttpClient对象
- HttpClienthttpClient=newDefaultHttpClient();
- //获取HttpResponse实例
- HttpResponsehttpResp=httpClient.execute(httpPost);
- //判断是够请求成功
- if(httpResp.getStatusLine().getStatusCode()==HTTP_200){
- //获取返回的数据
- Stringresult=EntityUtils.toString(httpResp.getEntity(),"UTF-8");
- Log.i(TAG_HTTPGET,"HttpPost方式请求成功,返回数据如下:");
- Log.i(TAG_HTTPGET,result);
- }else{
- Log.i(TAG_HTTPGET,"HttpPost方式请求失败");
- }
- }
以上是一些部分代码,测试的时候在测试类中运行对应的测试方法即可。完整代码点这里下载
以流的方式向服务器发送数据:
//HTTP连接管理public class HTTPManager {private static final int TIMEOUT = 5000;private static HTTPManager instance;private HttpURLConnection conn;private InputStream is;private OutputStream os;// 控制是否是服务器404错误public static boolean isStatusFail = false;//wap网络private static final String NETWORK_INFO_CTWAP = "ctwap"; private static final String NETWORK_INFO_CMWAP = "cmwap"; private static final String CDMA_HOSTNAME = "10.0.0.200"; private static final String GSM_HOSTNAME = "10.0.0.172"; private static final int PORT = 80;public static HTTPManager getInstance() {if (instance == null) {instance = new HTTPManager();}return instance;}/** * 获取当前可用网络, 并对相应网络设置代理 * @param url */ private void setProxy(Context context, URL url){ Proxy typeProxy = null; String apn = ApnUtil.getApnType(context); if(NETWORK_INFO_CTWAP.equals(apn)){ SocketAddress addr = new InetSocketAddress(CDMA_HOSTNAME, PORT); typeProxy = new Proxy(Proxy.Type.HTTP, addr); }else if(NETWORK_INFO_CMWAP.equals(apn)){ SocketAddress addr = new InetSocketAddress(GSM_HOSTNAME, PORT); typeProxy = new Proxy(Proxy.Type.HTTP, addr); } try {if(typeProxy != null){conn = (HttpURLConnection) url.openConnection(typeProxy); } else {conn = (HttpURLConnection) url.openConnection();}} catch (IOException e) {e.printStackTrace();} }// HTTP连接@SuppressWarnings("unused")public final String HTTPConnect(Context context, String urlString, String upload) {String result = null;BufferedReader rd = null;URL url = null;conn = null;os = null;try {url = new URL(urlString);setProxy(context, url);// 设置代理if (conn == null) {conn = (HttpURLConnection) url.openConnection();}conn.setConnectTimeout(TIMEOUT);// 设置超时conn.setReadTimeout(TIMEOUT); // 缓存的最长时间conn.setDoInput(true);// 允许输入conn.setDoOutput(true);// 允许输出conn.setUseCaches(false); // 不允许使用缓存conn.setRequestProperty("connection", "keep-alive");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Content-Type", "text/xml");if (upload != null) {byte[] dataUpdate = upload.getBytes("UTF-8");os = conn.getOutputStream();os.write(dataUpdate);}int status = 200;try {status = conn.getResponseCode();if (status == HttpStatus.SC_NOT_FOUND) {isStatusFail = true;return null;}} catch (Exception e) {e.printStackTrace();}ByteArrayOutputStream baos = new ByteArrayOutputStream();is = conn.getInputStream();byte[] temp = new byte[256];int len = 0;while ((len = is.read(temp)) != -1) {baos.write(temp, 0, len);}byte[] dataResult = baos.toByteArray();result = new String(dataResult, "UTF-8");is.close();is = null;if (os != null) {os.close();os = null;}conn = null;url = null;} catch (MalformedURLException e) {} catch (IOException e) {} catch (Exception e) {}return result;}/** * 强制断开连接 * @return */public boolean killConnection() {try {if (is != null) {is.close();is = null;}if (os != null) {os.close();os = null;}if (conn != null) {conn = null;}} catch (Exception e) {return false;}return true;}}
http://blog.csdn.net/zuolongsnail/article/details/6373051
更多相关文章
- Android中BindService方式使用的理解
- android异步网络连接开源:Android(安卓)Asynchronous Http Client
- Android(安卓)网络连接——URLConnection
- android: busybox am aapt
- Flutter之请求权限(适配android)
- 简单实现Android(安卓)AudioReccord录音方式
- Android(安卓)HTTP 实现与服务器通信
- android操作XML的几种方式
- android HAL框架