首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

android的http通讯方法

2012-06-30 
android的http通信方法package com.hl 002??003import java.io.BufferedReader 004import java.io.IOExc

android的http通信方法
package com.hl; 002??003import java.io.BufferedReader; 004import java.io.IOException; 005import java.io.InputStream; 006import java.io.InputStreamReader; 007import java.util.ArrayList; 008import java.util.HashMap; 009import java.util.Iterator; 010import java.util.Map; 011import java.util.Set; 012??013import org.apache.http.HttpEntity; 014import org.apache.http.HttpResponse; 015import org.apache.http.client.entity.UrlEncodedFormEntity; 016import org.apache.http.client.methods.HttpPost; 017import org.apache.http.impl.client.DefaultHttpClient; 018import org.apache.http.message.BasicNameValuePair; 019??020import android.app.Activity; 021import android.os.Bundle; 022import android.view.View; 023import android.view.View.OnClickListener; 024import android.widget.Button; 025import android.widget.EditText; 026import android.widget.TextView; 027??028public class SimplePOST extends Activity { 029?private TextView show; 030?private EditText txt; 031?private Button btn; 032???033????@Override 034????public void onCreate(Bundle savedInstanceState) { 035????????super.onCreate(savedInstanceState); 036????????setContentView(R.layout.main); 037????????show = (TextView)findViewById(R.id.show); 038????????txt = (EditText)findViewById(R.id.txt); 039????????btn = (Button)findViewById(R.id.btn); 040????????btn.setOnClickListener(new OnClickListener() { 041?????042???@Override 043???public void onClick(View v) { 044????dopost(txt.getText().toString()); 045??????046???} 047??}); 048????} 049??050?private void dopost(String val){ 051?????//封装数据 052?????Map<String, String> parmas = new HashMap<String, String>(); 053?????parmas.put("name", val); 054??????055?????DefaultHttpClient client = new DefaultHttpClient();//http客户端 056?????HttpPost httpPost = new HttpPost("http://mhycoe.com/test/post.php"); 057??????058?????ArrayList<BasicNameValuePair> pairs = new ArrayList<BasicNameValuePair>(); 059?????if(parmas != null){ 060?????????Set<String> keys = parmas.keySet(); 061?????????for(Iterator<String> i = keys.iterator(); i.hasNext();) { 062??????????????String key = (String)i.next(); 063??????????????pairs.add(new BasicNameValuePair(key, parmas.get(key))); 064?????????} 065????} 066??????067??try { 068???UrlEncodedFormEntity p_entity = new UrlEncodedFormEntity(pairs, "utf-8"); 069?????????/* 070??????????*? 将POST数据放入HTTP请求 071??????????*/ 072?????????httpPost.setEntity(p_entity); 073?????????/* 074??????????*? 发出实际的HTTP POST请求 075???????????*/ 076?????????HttpResponse response = client.execute(httpPost); 077?????????HttpEntity entity = response.getEntity(); 078?????????InputStream content = entity.getContent(); 079???String returnConnection = convertStreamToString(content); 080?????????show.setText(returnConnection); 081??} catch (IllegalStateException e) { 082???e.printStackTrace(); 083??} catch (IOException e) { 084???e.printStackTrace(); 085??} 086??????087?} 088??089??private String convertStreamToString(InputStream is) { 090???BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 091?????????StringBuilder sb = new StringBuilder(); 092?????????String line = null; 093?????????try { 094??????????????while ((line = reader.readLine()) != null) { 095???????????????????sb.append(line); 096??????????????} 097?????????} catch (IOException e) { 098??????????????e.printStackTrace(); 099?????????} finally { 100??????????????try { 101???????????????????is.close(); 102??????????????} catch (IOException e) { 103???????????????????e.printStackTrace(); 104??????????????} 105?????????} 106?????????return sb.toString(); 107?} 108}

?

?

??HttpURLConnection默认使用GET方式,例如下面代码所示:

?

  1. //使用HttpURLConnection打开连接 ?????????????????HttpURLConnection?urlConn?=?(HttpURLConnection)?url.openConnection(); ?
  2. ????????????????//得到读取的内容(流) ?????????????????InputStreamReader?in?=?new?InputStreamReader(urlConn.getInputStream()); ?
  3. ????????????????//?为输出创建BufferedReader ?????????????????BufferedReader?buffer?=?new?BufferedReader(in); ?
  4. ????????????????String?inputLine?=?null; ?????????????????//使用循环来读取获得的数据 ?
  5. ????????????????while?(((inputLine?=?buffer.readLine())?!=?null)) ?????????????????{ ?
  6. ????????????????????//我们在每一行后面加上一个"\n"来换行 ?????????????????????resultData?+=?inputLine?+?"\n"; ?
  7. ????????????????}????????? ?????????????????//关闭InputStreamReader ?
  8. ????????????????in.close(); ?????????????????//关闭http连接 ?
  9. ????????????????urlConn.disconnect();?



如果需要使用POST方式,则需要setRequestMethod设置。代码如下:

?

  1. String?httpUrl?=?"http://192.168.1.110:8080/httpget.jsp"; ?????????//获得的数据 ?
  2. ????????String?resultData?=?""; ?????????URL?url?=?null; ?
  3. ????????try?????????{ ?
  4. ????????????//构造一个URL对象 ?????????????url?=?new?URL(httpUrl);? ?
  5. ????????} ?????????catch?(MalformedURLException?e) ?
  6. ????????{ ?????????????Log.e(DEBUG_TAG,?"MalformedURLException"); ?
  7. ????????} ?????????if?(url?!=?null) ?
  8. ????????{ ?????????????try?
  9. ????????????{ ?????????????????//?使用HttpURLConnection打开连接 ?
  10. ????????????????HttpURLConnection?urlConn?=?(HttpURLConnection)?url.openConnection(); ?????????????????//因为这个是post请求,设立需要设置为true ?
  11. ????????????????urlConn.setDoOutput(true); ?????????????????urlConn.setDoInput(true); ?
  12. ????????????????//?设置以POST方式 ?????????????????urlConn.setRequestMethod("POST"); ?
  13. ????????????????//?Post?请求不能使用缓存 ?????????????????urlConn.setUseCaches(false); ?
  14. ????????????????urlConn.setInstanceFollowRedirects(true); ?????????????????//?配置本次连接的Content-type,配置为application/x-www-form-urlencoded的 ?
  15. ????????????????urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); ?????????????????//?连接,从postUrl.openConnection()至此的配置必须要在connect之前完成, ?
  16. ????????????????//?要注意的是connection.getOutputStream会隐含的进行connect。 ?????????????????urlConn.connect(); ?
  17. ????????????????//DataOutputStream流 ?????????????????DataOutputStream?out?=?new?DataOutputStream(urlConn.getOutputStream()); ?
  18. ????????????????//要上传的参数 ?????????????????String?content?=?"par="?+?URLEncoder.encode("ABCDEFG",?"gb2312"); ?
  19. ????????????????//将要上传的内容写入流中 ?????????????????out.writeBytes(content);? ?
  20. ????????????????//刷新、关闭 ?????????????????out.flush(); ?
  21. ????????????????out.close();??

2. HttpClient接口
??? 使用Apache提供的HttpClient接口同样可以进行HTTP操作。
??? 对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:

?

  1. //?http地址 ?????????String?httpUrl?=?"http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get"; ?
  2. ????????//HttpGet连接对象 ?????????HttpGet?httpRequest?=?new?HttpGet(httpUrl); ?
  3. ?????????//取得HttpClient对象 ?????????????HttpClient?httpclient?=?new?DefaultHttpClient(); ?
  4. ????????????//请求HttpClient,取得HttpResponse ?????????????HttpResponse?httpResponse?=?httpclient.execute(httpRequest); ?
  5. ????????????//请求成功 ?????????????if?(httpResponse.getStatusLine().getStatusCode()?==?HttpStatus.SC_OK) ?
  6. ????????????{ ?????????????????//取得返回的字符串 ?
  7. ????????????????String?strResult?=?EntityUtils.toString(httpResponse.getEntity()); ?????????????????mTextView.setText(strResult); ?
  8. ????????????} ?????????????else?
  9. ????????????{ ?????????????????mTextView.setText("请求错误!"); ?
  10. ????????????} ?????????}?

使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。,另外,还需要设置所使用的字符集。代码如下所示:

?

?

  1. //?http地址 ?????????String?httpUrl?=?"http://192.168.1.110:8080/httpget.jsp"; ?
  2. ????????//HttpPost连接对象 ?????????HttpPost?httpRequest?=?new?HttpPost(httpUrl); ?
  3. ????????//使用NameValuePair来保存要传递的Post参数 ?????????List<NameValuePair>?params?=?new?ArrayList<NameValuePair>(); ?
  4. ????????//添加要传递的参数 ?????????params.add(new?BasicNameValuePair("par",?"HttpClient_android_Post")); ?????????//设置字符集 ?????????????HttpEntity?httpentity?=?new?UrlEncodedFormEntity(params,?"gb2312"); ?
  5. ????????????//请求httpRequest ?????????????httpRequest.setEntity(httpentity); ?
  6. ????????????//取得默认的HttpClient ?????????????HttpClient?httpclient?=?new?DefaultHttpClient(); ?
  7. ????????????//取得HttpResponse ?????????????HttpResponse?httpResponse?=?httpclient.execute(httpRequest); ?
  8. ????????????//HttpStatus.SC_OK表示连接成功 ?????????????if?(httpResponse.getStatusLine().getStatusCode()?==?HttpStatus.SC_OK) ?
  9. ????????????{ ?????????????????//取得返回的字符串 ?
  10. ????????????????String?strResult?=?EntityUtils.toString(httpResponse.getEntity()); ?????????????????mTextView.setText(strResult); ?
  11. ????????????} ?????????????else?
  12. ????????????{ ?????????????????mTextView.setText("请求错误!"); ?
  13. ????????????} ?????????}?
HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。

??? 另外,在使用POST方式进行传输时,需要进行字符编码。

本文出自 “我的Android开发志” 博客,请务必保留此出处http://52android.blog.51cto.com/2554429/496621

?

?

?

热点排行