当前位置: 代码迷 >> Android >> android的http通讯方法
  详细解决方案

android的http通讯方法

热度:45   发布时间:2016-05-01 20:50:21.0
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打开连接 ?
  2. ????????????????HttpURLConnection?urlConn?=?(HttpURLConnection)?url.openConnection(); ?
  3. ????????????????//得到读取的内容(流) ?
  4. ????????????????InputStreamReader?in?=?new?InputStreamReader(urlConn.getInputStream()); ?
  5. ????????????????//?为输出创建BufferedReader ?
  6. ????????????????BufferedReader?buffer?=?new?BufferedReader(in); ?
  7. ????????????????String?inputLine?=?null; ?
  8. ????????????????//使用循环来读取获得的数据 ?
  9. ????????????????while?(((inputLine?=?buffer.readLine())?!=?null)) ?
  10. ????????????????{ ?
  11. ????????????????????//我们在每一行后面加上一个"\n"来换行 ?
  12. ????????????????????resultData?+=?inputLine?+?"\n"; ?
  13. ????????????????}????????? ?
  14. ????????????????//关闭InputStreamReader ?
  15. ????????????????in.close(); ?
  16. ????????????????//关闭http连接 ?
  17. ????????????????urlConn.disconnect();?



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

?

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

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

?

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

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

?

?

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

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

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

?

?

?

  相关解决方案