Android基于HTTP的两种常用通信方式
更新日期:
这是一篇老文,在我的博客园里,现在移到此处
标准Java:位于java.net.*
标准Java,步骤如下
- 构建URL对象(本例中请求的完整URL是http://news.google.com.hk/nwshp?hl=zh-CN&tab=wn )
String strUrl = null;
//下面给strUrl赋值,HTTP请求方式不同,即使是同一资源,URL也不同,若是get请求方式,则strUrl = "http://news.google.com.hk/nwshp?hl=zh-CN&tab=wn"
//若是post请求方式,则strUrl = "http://news.google.com.hk/nwshp"
URL url = new URL(strUrl)
- 使用URL的openConnection()方法获取HttpURLConnection对象
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
- 这一步需要根据客户端的请求方式的不同,进行不同的设置,以便获取服务器端的数据。这里以get()与 post()方法为例
[1] get()方法:在第2步打开URL连接以后,get()方法不需要向服务器发送任何请求就可以直接获取服务器的 数据了(因为get()方法的请求参数已经在第一步构建URL对象时放在了URL对象里)
1 2 3 4 5 6 7 8 9 10 | //得到输入流 InputStream input = urlConn.getInputStream(); //包装流对象 BufferedReader bufReader = new BufferedReader(new inputStreamReader(input)); //获取流中的数据 String resultData = ""; String line = null; while((line = bufReader.readLine()) != null) { resultData += line + "\n"; } |
[2] post方法:post()方法首先需要设置urlConn的属性,然后向服务器发送请求参数,最后获取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //设置参数 //设置输入输出流 urlConn.setDoOutput(true); urlConn.setDoInput(true); //设置请求方式为post urlConn.setRequestMethod("POST"); //设置post请求不能使用缓存 urlConn.setUseCaches(false); urlConn.setInstanceFollowRedirects(true); //设置http传输的数据类型Content-Type,通常,如果传输是字符数据, //一般设置为application/x-www-form-//urlencoded,如果传输的是对象, //则一般设置为application/x-java-serialized-oblect。 //本例中设置为application/x-www-form-urlencoded urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //与服务器连接 urlConn.connect(); //获取输出流,向服务器发送请求参数 DataOutputStream out = new DataOutputStream(urlConn.getOutputStream); //发送的请求参数 String content = "hl=" + URLEncoder("zh-CN&") + "tab=" + URLEncoder(wn); //将要上传的内容写入到流中 Out.writeBytes(content); //刷新,关闭 Out.flush(); Out.close(); |
接下来与get方法一样,从服务器端获取数据,这里不再赘述。这里补充一点,客户端的请求数据是在客户端调用getInputStream()时发送过去的,之前一直放在内存中。
Apache:位于org.apache.http.*
Apache是将Java标准底层接口进行封装而实现的一套网络编程接口,操作简单,功能强大,这里以get与post方法为例,步骤如下
[1] Get方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | String url = "http://news.google.com.hk/nwshp?hl=zh-CN&tab=wn"; //生成get请求对象HttpGet HttpGet httpRequest = new HttpGet(url); //生成默认的客户端对象HttpClient HttpClient httpClient = new DefaultHttpClient(); //向服务器发送请求对象,同时获取服务器应答对象 HttpResponse httpResponse = httpClient.execute(httpRequest); //获取服务器应答对象的状态信息,判断是否请求成功,若请求成功,则获取服务器回复的数据 if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ //获取应答对象的实体,也就是装载了回复内容的类 HttpEntity httpEntity = httpResponse.getEntity(); //从实体中提取回复信息 String resultData = EntityUtils.toString(httpEntity); } //如果请求状态不是SC_OK,则表示此次请求失败 else { } |
[2] Post方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | String url = "http://news.google.com.hk/nwshp"; HttpPost httpRequest = new HttpPost(url); //为post对象设置请求参数 //使用NameValuePair来存储要传递的参数键值对 List<NameValuePair> params = new ArrayList< NameValuePair >; //添加参数键值对 Params.add(new BasicNameValuePair("hl", "zh-CN")); Params.add(new BasicNameValuePair("tab", "wn")); //将参数集合以特定的编码方式转换成实体,此处的实体是请求实体 HttpEntity httpEntity = new UrlEncodedFormEntity(params, "UTF-8"); //设置请求对象的请求实体,也就是设置请求内容 httpRequest.setEntity(httpEntity); //生成默认的客户端对象 HttpClient httpClient = new DefaultHttpClient(); //向服务器发送请求对象,并获取服务器的应答对象 HttpResponse httpResponse = httpClient.execute(httpRequest); |
接下来就是判断应答对象的状态,看是否请求成功,若成功,则获取应答数据,与get方法完全一样,这里不再赘述。