Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看Android开发技巧总结中的Android单元测试的步骤一文。

java.net包中的HttpURLConnection类

Get方式:

view plain
  1. //Get方式请求
  2. publicstaticvoidrequestByGet()throwsException{
  3. Stringpath="https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
  4. //新建一个URL对象
  5. URLurl=newURL(path);
  6. //打开一个HttpURLConnection连接
  7. HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
  8. //设置连接超时时间
  9. urlConn.setConnectTimeout(5*1000);
  10. //开始连接
  11. urlConn.connect();
  12. //判断请求是否成功
  13. if(urlConn.getResponseCode()==HTTP_200){
  14. //获取返回的数据
  15. byte[]data=readStream(urlConn.getInputStream());
  16. Log.i(TAG_GET,"Get方式请求成功,返回数据如下:");
  17. Log.i(TAG_GET,newString(data,"UTF-8"));
  18. }else{
  19. Log.i(TAG_GET,"Get方式请求失败");
  20. }
  21. //关闭连接
  22. urlConn.disconnect();
  23. }

Post方式:

view plain
  1. //Post方式请求
  2. publicstaticvoidrequestByPost()throwsThrowable{
  3. Stringpath="https://reg.163.com/logins.jsp";
  4. //请求的参数转换为byte数组
  5. Stringparams="id="+URLEncoder.encode("helloworld","UTF-8")
  6. +"&pwd="+URLEncoder.encode("android","UTF-8");
  7. byte[]postData=params.getBytes();
  8. //新建一个URL对象
  9. URLurl=newURL(path);
  10. //打开一个HttpURLConnection连接
  11. HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
  12. //设置连接超时时间
  13. urlConn.setConnectTimeout(5*1000);
  14. //Post请求必须设置允许输出
  15. urlConn.setDoOutput(true);
  16. //Post请求不能使用缓存
  17. urlConn.setUseCaches(false);
  18. //设置为Post请求
  19. urlConn.setRequestMethod("POST");
  20. urlConn.setInstanceFollowRedirects(true);
  21. //配置请求Content-Type
  22. urlConn.setRequestProperty("Content-Type",
  23. "application/x-www-form-urlencode");
  24. //开始连接
  25. urlConn.connect();
  26. //发送请求参数
  27. DataOutputStreamdos=newDataOutputStream(urlConn.getOutputStream());
  28. dos.write(postData);
  29. dos.flush();
  30. dos.close();
  31. //判断请求是否成功
  32. if(urlConn.getResponseCode()==HTTP_200){
  33. //获取返回的数据
  34. byte[]data=readStream(urlConn.getInputStream());
  35. Log.i(TAG_POST,"Post请求方式成功,返回数据如下:");
  36. Log.i(TAG_POST,newString(data,"UTF-8"));
  37. }else{
  38. Log.i(TAG_POST,"Post方式请求失败");
  39. }
  40. }

org.apache.http包中的HttpGet和HttpPost类

Get方式:

view plain
  1. //HttpGet方式请求
  2. publicstaticvoidrequestByHttpGet()throwsException{
  3. Stringpath="https://reg.163.com/logins.jsp?id=helloworld&pwd=android";
  4. //新建HttpGet对象
  5. HttpGethttpGet=newHttpGet(path);
  6. //获取HttpClient对象
  7. HttpClienthttpClient=newDefaultHttpClient();
  8. //获取HttpResponse实例
  9. HttpResponsehttpResp=httpClient.execute(httpGet);
  10. //判断是够请求成功
  11. if(httpResp.getStatusLine().getStatusCode()==HTTP_200){
  12. //获取返回的数据
  13. Stringresult=EntityUtils.toString(httpResp.getEntity(),"UTF-8");
  14. Log.i(TAG_HTTPGET,"HttpGet方式请求成功,返回数据如下:");
  15. Log.i(TAG_HTTPGET,result);
  16. }else{
  17. Log.i(TAG_HTTPGET,"HttpGet方式请求失败");
  18. }
  19. }

Post方式:

view plain
  1. //HttpPost方式请求
  2. publicstaticvoidrequestByHttpPost()throwsException{
  3. Stringpath="https://reg.163.com/logins.jsp";
  4. //新建HttpPost对象
  5. HttpPosthttpPost=newHttpPost(path);
  6. //Post参数
  7. List<NameValuePair>params=newArrayList<NameValuePair>();
  8. params.add(newBasicNameValuePair("id","helloworld"));
  9. params.add(newBasicNameValuePair("pwd","android"));
  10. //设置字符集
  11. HttpEntityentity=newUrlEncodedFormEntity(params,HTTP.UTF_8);
  12. //设置参数实体
  13. httpPost.setEntity(entity);
  14. //获取HttpClient对象
  15. HttpClienthttpClient=newDefaultHttpClient();
  16. //获取HttpResponse实例
  17. HttpResponsehttpResp=httpClient.execute(httpPost);
  18. //判断是够请求成功
  19. if(httpResp.getStatusLine().getStatusCode()==HTTP_200){
  20. //获取返回的数据
  21. Stringresult=EntityUtils.toString(httpResp.getEntity(),"UTF-8");
  22. Log.i(TAG_HTTPGET,"HttpPost方式请求成功,返回数据如下:");
  23. Log.i(TAG_HTTPGET,result);
  24. }else{
  25. Log.i(TAG_HTTPGET,"HttpPost方式请求失败");
  26. }
  27. }

以上是一些部分代码,测试的时候在测试类中运行对应的测试方法即可。完整代码点这里下载


以流的方式向服务器发送数据:

//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

更多相关文章

  1. Android中BindService方式使用的理解
  2. android异步网络连接开源:Android(安卓)Asynchronous Http Client
  3. Android(安卓)网络连接——URLConnection
  4. android: busybox am aapt
  5. Flutter之请求权限(适配android)
  6. 简单实现Android(安卓)AudioReccord录音方式
  7. Android(安卓)HTTP 实现与服务器通信
  8. android操作XML的几种方式
  9. android HAL框架

随机推荐

  1. android 笔记 --- 自定义Android主题风格
  2. Android初学心得和一些资料下载
  3. android之单元测试——上
  4. android UI进阶之仿iphone的tab效果 (Andr
  5. Android(安卓)image的示例 拍照显示
  6. Unity3D调用android方法(非插件方式)
  7. Android札记【2】——系统的认识心中的An
  8. 自己动手写一个简单的Android下拉刷新
  9. Android(安卓)补间动画(动画列表,平移,旋转
  10. Android之崩溃日志管理(原创)