Android 如何使用Http协议访问网络
Android使用Http协议访问网络主要有两种方式,一个是使用 java.net.*(标准Java接口),另一个是使用 Org.apache接口。
java.net.*:中是可以认为是JDK中的java网络处理包,提供了流,Socket,网络协议等常见网络相关类。
Apache HttpClient:是一个开源项目,功能相对与JDK中的更加完善,可以为客户端提供高效丰富的Http编程支持
一:使用java.net包来进行Http协议的网络编程
public class CustomHttpURLConnection { private static String TAG = "CustomHttpUrlConnection"; //代表 客户端与服务器之间的一个Http连接 private static HttpURLConnection conn; public CustomHttpURLConnection() { } /** * 向服务器发送Get请求 * @param strUrl 发送Get请求的url地址 * @param nameValuePairs get请求参数 * @return */ public static String GetFromWebByHttpUrlConnection(String strUrl, NameValuePair... nameValuePairs) { String result=""; try { //1.新建Url对象 URL url = new URL(strUrl); //2.获取并设置HttpURLConnection对象 conn = (HttpURLConnection) url.openConnection(); conn.setDoInput(true); conn.setConnectTimeout(3000); conn.setReadTimeout(4000); conn.setRequestProperty("accept", "*/*"); //3.连接服务器 conn.connect(); //4.从建立好的连接中获取inputStream InputStream stream=conn.getInputStream(); //5.为了更好的读取inputStream中的数据,包装inputStream InputStreamReader inReader=new InputStreamReader(stream); BufferedReader buffer=new BufferedReader(inReader); //6.开始读取数据 String strLine=null; while((strLine=buffer.readLine())!=null) { result+=strLine; } //7.关闭出入流 inReader.close(); //8.关闭连接 conn.disconnect(); return result; } catch (MalformedURLException e) { Log.e(TAG, "getFromWebByHttpUrlCOnnection:"+e.getMessage()); e.printStackTrace(); return null; } catch (IOException e) { Log.e(TAG, "getFromWebByHttpUrlCOnnection:"+e.getMessage()); e.printStackTrace(); return null; } } /** * 向服务器发送Post请求 * @param strUrl * @param nameValuePairs * @return */ public static String PostFromWebByHttpURLConnection(String strUrl, NameValuePair... nameValuePairs) { String result=""; try { URL url = new URL(strUrl); conn = (HttpURLConnection) url .openConnection(); // 设置是否从httpUrlConnection读入,默认情况下是true; conn.setDoInput(true); // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 // http正文内,因此需要设为true, 默认情况下是false; conn.setDoOutput(true); // 设定请求的方法为"POST",默认是GET conn.setRequestMethod("POST"); //设置超时 conn.setConnectTimeout(3000); conn.setReadTimeout(4000); // Post 请求不能使用缓存 conn.setUseCaches(false); conn.setInstanceFollowRedirects(true); // 设定传送的内容类型是可序列化的java对象 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException) conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 连接,从上述第2条中url.openConnection()至此的配置必须要在connect之前完成, conn.connect(); InputStream in = conn.getInputStream(); InputStreamReader inStream=new InputStreamReader(in); BufferedReader buffer=new BufferedReader(inStream); String strLine=null; while((strLine=buffer.readLine())!=null) { result+=strLine; } return result; } catch (IOException ex) { Log.e(TAG,"PostFromWebByHttpURLConnection:"+ ex.getMessage()); ex.printStackTrace(); return null; } } }
二:使用Apache HttpClient
public class CustomHttpClient { private static String TAG = "CustomHttpClient"; private static final CommonLog log = LogFactory.createLog(); private static final String CHARSET_UTF8 = HTTP.UTF_8; private static final String CHARSET_GB2312 = "GB2312"; private static HttpClient customerHttpClient; private CustomHttpClient() { } /** * HttpClient post方法 * * @param url * @param nameValuePairs * @return */ public static String PostFromWebByHttpClient(Context context, String url, NameValuePair... nameValuePairs) { try { List<NameValuePair> params = new ArrayList<NameValuePair>(); if (nameValuePairs != null) { for (int i = 0; i < nameValuePairs.length; i++) { params.add(nameValuePairs[i]); } } UrlEncodedFormEntity urlEncoded = new UrlEncodedFormEntity(params, CHARSET_UTF8); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(urlEncoded); HttpClient client = getHttpClient(context); HttpResponse response = client.execute(httpPost); if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { throw new RuntimeException("请求失败"); } HttpEntity resEntity = response.getEntity(); return (resEntity == null) ? null : EntityUtils.toString(resEntity, CHARSET_UTF8); } catch (UnsupportedEncodingException e) { Log.w(TAG, e.getMessage()); return null; } catch (ClientProtocolException e) { Log.w(TAG, e.getMessage()); return null; } catch (IOException e) { throw new RuntimeException(context.getResources().getString( R.string.httpError), e); } } public static String getFromWebByHttpClient(Context context, String url, NameValuePair... nameValuePairs) throws Exception{ log.d("getFromWebByHttpClient url = " + url); try { // http地址 // String httpUrl = // "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get"; StringBuilder sb = new StringBuilder(); sb.append(url); if (nameValuePairs != null && nameValuePairs.length > 0) { sb.append("?"); for (int i = 0; i < nameValuePairs.length; i++) { if (i > 0) { sb.append("&"); } sb.append(String.format("%s=%s", nameValuePairs[i].getName(), nameValuePairs[i].getValue())); } } // HttpGet连接对象 HttpGet httpRequest = new HttpGet(sb.toString()); // 取得HttpClient对象 HttpClient httpclient = getHttpClient(context); // 请求HttpClient,取得HttpResponse HttpResponse httpResponse = httpclient.execute(httpRequest); // 请求成功 if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { throw new RuntimeException(context.getResources().getString( R.string.httpError)); } return EntityUtils.toString(httpResponse.getEntity()); } catch (ParseException e) { // TODO Auto-generated catch block throw new RuntimeException(context.getResources().getString( R.string.httpError),e); } catch (IOException e) { // TODO Auto-generated catch block log.e("IOException "); e.printStackTrace(); throw new RuntimeException(context.getResources().getString( R.string.httpError),e); } } /** * 创建httpClient实例 * * @return * @throws Exception */ private static synchronized HttpClient getHttpClient(Context context) { if (null == customerHttpClient) { HttpParams params = new BasicHttpParams(); // 设置一些基本参数 HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, CHARSET_UTF8); HttpProtocolParams.setUseExpectContinue(params, true); HttpProtocolParams .setUserAgent( params, "Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) " + "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1"); // 超时设置 /* 从连接池中取连接的超时时间 */ ConnManagerParams.setTimeout(params, 1000); /* 连接超时 */ int ConnectionTimeOut = 3000; if (!HttpUtils.isWifiDataEnable(context)) { ConnectionTimeOut = 10000; } HttpConnectionParams .setConnectionTimeout(params, ConnectionTimeOut); /* 请求超时 */ HttpConnectionParams.setSoTimeout(params, 4000); // 设置我们的HttpClient支持HTTP和HTTPS两种模式 SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); schReg.register(new Scheme("https", SSLSocketFactory .getSocketFactory(), 443)); // 使用线程安全的连接管理来创建HttpClient ClientConnectionManager conMgr = new ThreadSafeClientConnManager( params, schReg); customerHttpClient = new DefaultHttpClient(conMgr, params); } return customerHttpClient; } }
相关推荐
在这个项目"HttpGet.rar_Android httpget_HttpGet android_android_httpget_http"中...通过实践这个项目,你可以深化对Android网络编程的理解,同时熟悉`HttpClient`的使用,这对于构建需要网络交互的应用非常有帮助。
1. Android网络编程概述 Android网络编程是指在Android平台上开发能够处理网络请求的应用程序的编程实践。这通常涉及实现客户端与服务器之间的数据交换,使用不同的网络协议如HTTP/HTTPS以及进行网络状态监控等。 2...
Android网络编程是移动应用开发中的一个重要组成部分,而Http通信则是网络编程中最常用的协议之一。在Android平台上,我们通常会使用HttpURLConnection或者第三方库如Apache HttpClient和OkHttp等进行Http通信。 1....
本节将深入探讨Android网络编程的基础知识,主要围绕Java网络编程这一核心概念展开。 首先,理解Android网络编程的基础概念至关重要。在Android中,网络操作通常在后台线程中执行,以避免阻塞主线程导致应用无响应...
### Android网络编程——聊天室开发 #### 一、概述 Android聊天室项目是基于Socket网络编程的一个典型应用案例。通过本项目的开发,开发者可以深入了解如何利用Android设备与服务器端进行通信,实现多人在线聊天的...
5. **网络编程**:涵盖Android中的网络请求,包括使用HttpURLConnection、HttpClient以及现代的OkHttp库进行HTTP通信,还有对JSON数据的解析和序列化。 6. **多线程与异步处理**:介绍如何在Android中进行多线程...
本教程将引导初学者进入Android网络编程的世界,专注于图片下载这一实际应用。我们将使用Tomcat服务器来存储和提供图片,然后在Android客户端进行下载操作。 首先,理解Android的网络访问规则是至关重要的。Android...
本资源“Android-for-Xinlang.rar”专注于讲解如何在Android环境中构建一个简版的新浪微博客户端,涵盖了一系列关键的Android网络编程技术。以下是相关的知识点详解: 1. **Android SDK与环境搭建**:首先,你需要...
这个压缩包对于那些刚刚接触Android开发或者希望深入理解Android应用编程的初学者来说非常有价值。 Android是一个开源的操作系统,主要应用于移动设备,如智能手机和平板电脑。它的应用程序框架允许开发者使用Java...
### Android网络编程基础知识点 #### 一、网络状态检测 在Android开发中,为了确保应用程序能够根据当前网络环境做出响应,通常需要先检测设备的网络连接状态。这可以通过`ConnectivityManager`类来实现。 1. **...
Android网路编程代码 设计客户端和服务器端通信 适合初学者学习 当然其中包括很多其他知识点 例如基于handler的主副线程通信机制 多线程应用等 另外 对于Android入门的学习者 也是一手极好的学习资料 下载即可运行 ...
9. **API设计模式**:RESTful API是一种常见的设计模式,通过HTTP动词(GET, POST, PUT, DELETE等)来表示资源的操作,返回JSON数据,这在Android网络编程中非常常见。 10. **数据模型设计**:根据服务器返回的JSON...
有同学说不能解压,请仔细看看,要把所有5个压缩包一起下载,才能正常解压。绝对是高清扫描,中文版的文件。 ... ...请楼下不会下载的同学注意素质,...第13章 蓝牙、网络和wi-fi 第14章 传感器 第15章 android高级开发
在Android平台上进行网络测试是一项重要的任务,这涉及到应用程序的性能、稳定性和用户体验。...下面我们将详细探讨相关的...通过分析和使用其中的资源,开发者可以深入理解Android网络编程,并提升其应用的网络功能质量。
Android API是Google为开发者提供的接口集合,涵盖了Android系统的核心功能,包括用户界面、网络通信、硬件访问、多媒体处理等。学习Android API是Android开发的第一步,它让开发者能够调用系统服务,创建出功能丰富...
这是关于安卓网络开发的一些源代码,是相关博客文章讲到的
Android网络编程
这个主题,"Android_Http_服务器",涉及到的是如何利用Android原生API来搭建一个Http服务器,而不是依赖于任何第三方库。让我们深入探讨这个话题。 首先,Android系统本身并不直接支持内置的Http服务器功能,但...
- **网络编程**:讲解如何使应用程序能够访问网络资源和服务。 #### 3. 高级功能与实践 - **多媒体处理**:涉及如何在应用程序中集成音频、视频等多媒体功能。 - **位置服务**:介绍如何利用 GPS 等技术为用户提供...