android的http通信方法
003 | import java.io.BufferedReader; |
004 | import java.io.IOException; |
005 | import java.io.InputStream; |
006 | import java.io.InputStreamReader; |
007 | import java.util.ArrayList; |
008 | import java.util.HashMap; |
009 | import java.util.Iterator; |
013 | import org.apache.http.HttpEntity; |
014 | import org.apache.http.HttpResponse; |
015 | import org.apache.http.client.entity.UrlEncodedFormEntity; |
016 | import org.apache.http.client.methods.HttpPost; |
017 | import org.apache.http.impl.client.DefaultHttpClient; |
018 | import org.apache.http.message.BasicNameValuePair; |
020 | import android.app.Activity; |
021 | import android.os.Bundle; |
022 | import android.view.View; |
023 | import android.view.View.OnClickListener; |
024 | import android.widget.Button; |
025 | import android.widget.EditText; |
026 | import android.widget.TextView; |
028 | public class SimplePOST extends Activity { |
029 | ? private TextView show; |
030 | ? private EditText txt; |
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() { |
043 | ??? public void onClick(View v) { |
044 | ???? dopost(txt.getText().toString()); |
050 | ? private void dopost(String val){ |
052 | ????? Map<String, String> parmas = new HashMap<String, String>(); |
053 | ????? parmas.put( "name" , val); |
055 | ????? DefaultHttpClient client = new DefaultHttpClient(); |
056 | ????? HttpPost httpPost = new HttpPost( "http://mhycoe.com/test/post.php" ); |
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))); |
068 | ??? UrlEncodedFormEntity p_entity = new UrlEncodedFormEntity(pairs, "utf-8" ); |
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(); |
089 | ?? private String convertStreamToString(InputStream is) { |
090 | ??? BufferedReader reader = new BufferedReader( new InputStreamReader(is)); |
091 | ????????? StringBuilder sb = new StringBuilder(); |
092 | ????????? String line = null ; |
094 | ?????????????? while ((line = reader.readLine()) != null ) { |
095 | ??????????????????? sb.append(line); |
097 | ????????? } catch (IOException e) { |
098 | ?????????????? e.printStackTrace(); |
101 | ??????????????????? is.close(); |
102 | ?????????????? } catch (IOException e) { |
103 | ??????????????????? e.printStackTrace(); |
106 | ????????? return sb.toString(); |
?
?
??HttpURLConnection默认使用GET方式,例如下面代码所示:
?
- ?
- ????????????????HttpURLConnection?urlConn?=?(HttpURLConnection)?url.openConnection(); ?
- ?????????????????
- ????????????????InputStreamReader?in?=?new?InputStreamReader(urlConn.getInputStream()); ?
- ?????????????????
- ????????????????BufferedReader?buffer?=?new?BufferedReader(in); ?
- ????????????????String?inputLine?=?null; ?
- ?????????????????
- ????????????????while?(((inputLine?=?buffer.readLine())?!=?null)) ?
- ????????????????{ ?
- ?????????????????????
- ????????????????????resultData?+=?inputLine?+?"\n"; ?
- ????????????????}????????? ?
- ?????????????????
- ????????????????in.close(); ?
- ?????????????????
- ????????????????urlConn.disconnect();?
如果需要使用POST方式,则需要setRequestMethod设置。代码如下:
?
- String?httpUrl?=?"http://192.168.1.110:8080/httpget.jsp"; ?
- ?????????
- ????????String?resultData?=?""; ?
- ????????URL?url?=?null; ?
- ????????try?
- ????????{ ?
- ?????????????
- ????????????url?=?new?URL(httpUrl);? ?
- ????????} ?
- ????????catch?(MalformedURLException?e) ?
- ????????{ ?
- ????????????Log.e(DEBUG_TAG,?"MalformedURLException"); ?
- ????????} ?
- ????????if?(url?!=?null) ?
- ????????{ ?
- ????????????try?
- ????????????{ ?
- ?????????????????
- ????????????????HttpURLConnection?urlConn?=?(HttpURLConnection)?url.openConnection(); ?
- ?????????????????
- ????????????????urlConn.setDoOutput(true); ?
- ????????????????urlConn.setDoInput(true); ?
- ?????????????????
- ????????????????urlConn.setRequestMethod("POST"); ?
- ?????????????????
- ????????????????urlConn.setUseCaches(false); ?
- ????????????????urlConn.setInstanceFollowRedirects(true); ?
- ?????????????????
- ????????????????urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); ?
- ?????????????????
- ?????????????????
- ????????????????urlConn.connect(); ?
- ?????????????????
- ????????????????DataOutputStream?out?=?new?DataOutputStream(urlConn.getOutputStream()); ?
- ?????????????????
- ????????????????String?content?=?"par="?+?URLEncoder.encode("ABCDEFG",?"gb2312"); ?
- ?????????????????
- ????????????????out.writeBytes(content);? ?
- ?????????????????
- ????????????????out.flush(); ?
- ????????????????out.close();??
2. HttpClient接口
??? 使用Apache提供的HttpClient接口同样可以进行HTTP操作。
??? 对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:
?
- ?
- ????????String?httpUrl?=?"http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get"; ?
- ?????????
- ????????HttpGet?httpRequest?=?new?HttpGet(httpUrl); ?
- ??????????
- ????????????HttpClient?httpclient?=?new?DefaultHttpClient(); ?
- ?????????????
- ????????????HttpResponse?httpResponse?=?httpclient.execute(httpRequest); ?
- ?????????????
- ????????????if?(httpResponse.getStatusLine().getStatusCode()?==?HttpStatus.SC_OK) ?
- ????????????{ ?
- ?????????????????
- ????????????????String?strResult?=?EntityUtils.toString(httpResponse.getEntity()); ?
- ????????????????mTextView.setText(strResult); ?
- ????????????} ?
- ????????????else?
- ????????????{ ?
- ????????????????mTextView.setText("请求错误!"); ?
- ????????????} ?
- ????????}?
使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。,另外,还需要设置所使用的字符集。代码如下所示:
?
?
- ?
- ????????String?httpUrl?=?"http://192.168.1.110:8080/httpget.jsp"; ?
- ?????????
- ????????HttpPost?httpRequest?=?new?HttpPost(httpUrl); ?
- ?????????
- ????????List<NameValuePair>?params?=?new?ArrayList<NameValuePair>(); ?
- ?????????
- ????????params.add(new?BasicNameValuePair("par",?"HttpClient_android_Post")); ?
- ?????????
- ????????????HttpEntity?httpentity?=?new?UrlEncodedFormEntity(params,?"gb2312"); ?
- ?????????????
- ????????????httpRequest.setEntity(httpentity); ?
- ?????????????
- ????????????HttpClient?httpclient?=?new?DefaultHttpClient(); ?
- ?????????????
- ????????????HttpResponse?httpResponse?=?httpclient.execute(httpRequest); ?
- ?????????????
- ????????????if?(httpResponse.getStatusLine().getStatusCode()?==?HttpStatus.SC_OK) ?
- ????????????{ ?
- ?????????????????
- ????????????????String?strResult?=?EntityUtils.toString(httpResponse.getEntity()); ?
- ????????????????mTextView.setText(strResult); ?
- ????????????} ?
- ????????????else?
- ????????????{ ?
- ????????????????mTextView.setText("请求错误!"); ?
- ????????????} ?
- ????????}?
HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。
??? 另外,在使用POST方式进行传输时,需要进行字符编码。
本文出自 “我的Android开发志” 博客,请务必保留此出处http://52android.blog.51cto.com/2554429/496621
?
?
?