在Android系统中,提供了如下3种通信接口:
Apache接口:org.apache.http。标准java接口:java.net。Android网络接口:android.net.http。 1.使用Apache接口 在Android系统中,可以采用HttpPost和HttpGet封装post和Get请求,再使用HttpClient的excute()方法发送post()或者get()请求,并返回服务器的响应数据。 对于post和get的区别推荐下面链接的文章,个人觉得讲的中肯也很深入,http://www.techweb.com.cn/network/system/2016-10-11/2407736.shtml 基本流程可以参照下面的代码: 1.1实现Get请求 (1)得到网页HTML代码 try{ HttpClient httpClient = new DefaultHttpClient(); HttpGet get = new HttpGet(网址); // String response = httpClient.excute(get); HttPReponse response = httpClient.excute(get); BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer line = reader.readLine(); while(line!=null){ line.append(line) ; line = reader.readLine(); } }catch... (2)简单Get请求得到网页响应结果,转化为字符串 try{ HttpClient httpClient = new DefaultHttpClient(httpParams); HttpGet get = new HttpGet(网址); String response = httpClient.excute(get,new BasicResponseHandler()); }catch... (3) 提交带表单的url,百度搜索常出现,如www.baidu.com/s?ie=utf-8&tn=baidu&wd=csdn,获取到输入流(服务器指定)转化为字符串 try{ HttpClient httpClient = new DefaultHttpClient(); HttpGet get = new HttpGet(带表单的url); HttpReponse response = httpClient.excute(get); if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)){ InputStream is = response.getEntity().getContent(); String result = StreamToString(is); } }catch... //不了解流的读者可以先预览一下java的输入输出 private String StreamToString(InputStream is) throws Exception{ ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); byte[] bytes = new byte[1024]; int len = is.read(bytes);//由is到bytes,每次最多读取1024个字节,len是读取的长度 while(len!=-1){ byteStream.write(bytes,0,len);//由bytes到 byteStream len = is.read(bytes); } return new String(byteStream.toByteArray());//带参数的String } 1.2 实现post请求 使用post的url后面并没有带有提交内容的表单,而是被包装成了一个NmaeValuePari的类型的集合形式,然后调用HttpPost的setEntity设置参数,最后由HttpClient执行。List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("id",id));。。。。//对params调用add添加数据try { HttpPost request = new HttpPost(url); HttpResponse response; HttpClient httpClient = new DefaultHttpClient(); try{ HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8"); request.setEntity(entity); response = httpClient.execute(request); //如果返回状态为200,获得返回的结果 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { str = EntityUtils.toString(response.getEntity()); } }catch (Exception e){ e.printStackTrace(); }}catch(Exception e){ e.printStackTrace();} 1.3 实现文件上传 在有些场合例如我们需要用到上传文件的时候,就不能使用基本的get和post请求了,下面介绍一个使用多部件Post上传文件到服务器。首先需要到Apache官网下载HttpComponent,把其中的HttpMine.jar放到项目中。 我们用HttpMine提供的InputStreamBody处理文件流,用StringBody处理简单的文本,最后把他们都放入MultipartEntity的实体中,然后将这个MultipartEntity设为post的参数实体,再执行post。 public void upLoad() throws Exception{ InputStream is = getContext().getAssets().open("book.xml");//注意getContext().getAssets()取得的是当前路径 HttpClient client = new DefaultClient(); HttpPost post = new HttpPost(url); InputStreamBody streamBody = new InputStreamBody(is,"book.xml"); MultipartEntity multientity = new MultipartEntity(); multientity.addPart("file",streamBody); multientity.addPart("desc","fileupload is so easy to study"); post.setEntity(multientity); HttpReponse response = httpClient.excute(post); if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)){ is = response.getEntity().getContent(); String result = StreamToString(is); } 从上面的代码中可以看出,在发送get请求时参数放在Url中即可,也可以没有参数,发送post请求时将参数封装成Entity实体再发送。不管post还是get请求,如果程序返回的确定是字符流,则可以用字符流来读取,否则健壮一点的代码还是使用字节流读取。 1.4 多线程 在很多Android项目中,需要在多处进行Http通信,这时显然为每个请求创建一个新的HttpClient是不明智的,反而整个应用使用一个HttpClient就够了。通过一个HttpClient同时发出多个请求时可能引起多线程问题,处理过程如下: (1)扩展系统默认的Myapplication,并应用到项目中 pubilc void onCreate(){ super.onCreate(); httpclient = this.createHttpClient(); } //关闭连接管理器,看情况调用 private void shutdownHttpClient(){ if(httpclient!=null&&httpclient.getConnectioonManager()!=null){ httpclient.getConnectioonManager().shutdown(); } } //对外提供HttpClient实例、 public HttpClient getHttpClient(){ return httpclient; } //创建HttpClient实例 public HttpClient createHttpClient(){ HttpParams httpParams = new BasicHttpParams(); ......//设置一些版本,编码参数 SchemeRegistry schReg = new SchemeRegistry(); ....//继续设置参数,重点在下面两句 CilentConnectionManager connManager = new ThreadSafeClientConnManager(params,schReg); return new DefaultHttpClient(connManager,params); } (2)在Activity中使用 try{ MyApplication app = (MyApplication)this.getApplication(); HttpClient client = app.getHttpClient(); .....//下面常规的写法,上面已有范例 }catch...
新闻热点
疑难解答