文档库 最新最全的文档下载
当前位置:文档库 › Http请求和服务器返回解析.

Http请求和服务器返回解析.

Http请求和服务器返回解析.
Http请求和服务器返回解析.

android采用post方式获取服务器数据

地址:https://www.wendangku.net/doc/7513525524.html,/archives/464

Add a comment 1,597 viewsNovember 11th, 2011 Charlie

android, http, json android http post 请求, android 解析json

总结android 采用http请求访问网络并获取数据的步骤:

1.发送http请求,并传递相应的参数;

2.获取http返回的状态,根据返回的状态,如404错误,500错误,连接超时,请求异常等,并在界面提示相关状态;

3.web服务器端封装数据并返回一定格式的数据对象,例如封装json对象;

4.http状态返回正常,取出正确的参数并解析,如解析json对象;

5.解析服务器端返回的数据后显示在android相应的控件或存储本地数据,提示操作完成等。

因为习惯使用以上的5个步骤,于是写了一个相对完善的一个处理方法。以下主要是使用post 方式获取数据并解析封装的过程,封装json主要有两种封装方法:一种是单个json封装,另一种是带数组的json封装;解析json对应相应的方法。服务器端封装数据的语言采用php封装。get方式请求的方法过程类似。

1.发送服务器的http post请求方法

为了使编写的http post请求具有高度的可重用性,对于传递参数采用类似键值对的数组方式分别传递参数以及参数的值,String []key,String []value就是这样的一个类似键值对的传参方式。key是传递的参数,value是参数对应的值,url则是访问的地址。

HttpPostRequest .java源码:

view plaincopy to clipboardprint?

1.package com.httppost.main;

2.

3.import java.io.IOException;

4.import java.io.InterruptedIOException;

5.import java.io.UnsupportedEncodingException;

6.import java.util.ArrayList;

7.import java.util.List;

8.

9.import org.apache.http.HttpEntity;

10.import org.apache.http.HttpResponse;

11.import org.apache.http.client.ClientProtocolException;

12.import org.apache.http.client.entity.UrlEncodedFormEntity;

13.import org.apache.http.client.methods.HttpPost;

14.import org.apache.http.conn.ConnectTimeoutException;

15.import org.apache.http.impl.client.DefaultHttpClient;

16.import org.apache.http.message.BasicNameValuePair;

17.import org.apache.http.params.HttpConnectionParams;

18.import org.apache.http.protocol.HTTP;

19.import org.apache.http.util.EntityUtils;

20.

21.public class HttpPostRequest {

22.

23.private String webContext;

24.//返回请求内容

25.public String getWebContext() {

26.return webContext;

27.}

28.public void setWebContext(String webContext) {

29.this.webContext = webContext;

30.}

31.//该函数返回服务器访问的各种状态,并通过webContext传递获取的文本值

32./**

33.* 参数说明

34.* url 访问的网络地址

35.* key 传递参数的名称

36.* value 传递参数的值

37.* key 与value数组长度对应,即一对键值对,这样可以不限制参数传递的个数

38.* */

39.public int requestHttp(String url,String []key,String []value) {

40.// TODO Auto-generated method stub

41.int status = 0;

42.DefaultHttpClient mHttpClient = new DefaultHttpClient();

43.HttpPost mPost = new HttpPost(url);

44.List pairs = new ArrayList();

45.int size=key.length;

46.for(int i=0;i

47.pairs.add(new BasicNameValuePair(key[i], value[i]));

48.}

49.try {

50.mPost.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));

51.} catch (UnsupportedEncodingException e1) {

52.// TODO Auto-generated catch block

53.e1.printStackTrace();

54.}

55.try {

56.// Socket超时设置60s

57.mHttpClient.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,6000

0);

58.// 连接超时60s

59.mHttpClient.getParams().setIntParameter(HttpConnectionParams.CONNECTION_TIME

OUT,60000);

60.HttpResponse response = mHttpClient.execute(mPost);

61.int res = response.getStatusLine().getStatusCode();

62.if (res == 200) {

63.HttpEntity entity = response.getEntity();

64.if (entity != null) {

65.String info = EntityUtils.toString(entity);

66.setWebContext(info);

67.status=1;

68.}

69.} else if (res == 404) {

70.status = 404;

71.} else if (res == 500) {

72.status = 500;

73.}

74.} catch (ClientProtocolException e) {

75.// TODO Auto-generated catch block

76. e.printStackTrace();

77.status = 900;

78.} catch (ConnectTimeoutException e) {

79.// TODO Auto-generated catch block

80. e.printStackTrace();

81.status = 901;

82.} catch (InterruptedIOException e) {

83.// TODO Auto-generated catch block

84. e.printStackTrace();

85.status = 902;

86.} catch (IOException e) {

87.// TODO Auto-generated catch block

88. e.printStackTrace();

89.status = 903;

90.}

91.return status;

92.}

93.}

2.获取服务器端返回http状态的提示及处理方法

根据服务器返回的状态提示相应的信息的类,可以根据实际需要自定义提示状态,例如登录,注册等提示。

Http_Status_Tips.java源码:

view plaincopy to clipboardprint?

1.package com.httppost.main;

2.

3.import android.app.ProgressDialog;

4.import android.content.Context;

5.import android.widget.Toast;

6.

7.public class Http_Status_Tips {

8.//服务器端返回的状态提示

9.public static final String HTTP_0="其他错误";

10.public static final String HTTP_1="";

11.public static final String HTTP_404="404错误,请求链接无效";

12.public static final String HTTP_500="网络500错误,服务器端程序出错";

13.public static final String HTTP_900="网络传输协议出错";

14.public static final String HTTP_901="连接超时";

15.public static final String HTTP_902="网络中断";

16.public static final String HTTP_903="网络数据流传输出错";

17.public static final String HTTP_UNKONW="未知的错误";

18.

19.//自定义的提示

20.private String tips;

21.

22.public void ShowHttpStatusTips(int status,Context context,ProgressDialog pr

oDialog){

23.switch(status){

24.case0:

25.Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show();

26.break;

27.case1:

28.//Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show();

29.break;

30.case2:

31.Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show();

32.break;

33.case3:

34.Toast.makeText(context, getTips(), Toast.LENGTH_LONG).show();

35.break;

36.case404:

37.Toast.makeText(context, HTTP_404, Toast.LENGTH_LONG).show();

38.

39.break;

40.case500:

41.Toast.makeText(context, HTTP_500,Toast.LENGTH_LONG).show();

42.break;

43.case900:

44.Toast.makeText(context, HTTP_900, Toast.LENGTH_LONG).show();

45.break;

46.case901:

47.Toast.makeText(context, HTTP_901, Toast.LENGTH_LONG).show();

48.break;

49.case902:

50.Toast.makeText(context, HTTP_902, Toast.LENGTH_LONG).show();

51.break;

52.case903:

53.Toast.makeText(context, HTTP_903, Toast.LENGTH_LONG).show();

54.break;

55.default:

56.Toast.makeText(context, HTTP_UNKONW, Toast.LENGTH_LONG).show();

57.break;

58.}

59.if(proDialog!=null)

60.proDialog.dismiss();

61.}

62.

63.public String getTips() {

64.return tips;

65.}

66.public void setTips(String tips) {

67.this.tips = tips;

68.}

69.

70.}

3.服务器端封装json数据的方法

采用php语言封装json的两种格式,数据可以是从数据库返回的数组,本例只采用简单的赋值方式返回数据。$_POST["type"]对应的是post的请求方式获取参数值。

(1.)封装单个json对象

json_1.php

view plaincopy to clipboardprint?

1.

2.//对于POST的请求

3.$type=$_POST["type"];

4.$arr = array(

5.

6.'id'=>'2',

7.

8.'username'=>'william',

9.

10.'lat'=>'113.09',

11.

12.'lon'=>'22.2982',

13.

14.'type'=>'传递参数:'.$type

15.);

16.echo json_encode($arr);

17.?>

(2.)封装带数组的json对象

json_2.php

view plaincopy to clipboardprint?

1.

2.//对于POST的请求

3.$type=$_POST["type"];

4.

5.$arr=array();

6.

7.$a = array(

8.

9.'id'=>'1',

10.

11.'username'=>'charlie',

12.

13.'lat'=>'113.09832',

14.

15.'lon'=>'22.29322',

16.

17.'type'=>'传递参数:'.$type

18.);

19.$b = array(

20.

21.'id'=>'2',

22.

23.'username'=>'william',

24.

25.'lat'=>'113.09',

26.

27.'lon'=>'22.2982',

28.

29.'type'=>'传递参数:'.$type

30.);

31.//将两个数组合并成一个数组

32.array_push($arr,$a);

33.array_push($arr,$b);

34.//封装成json_2的json

35.echo "{\"json_2\":".json_encode($arr)."}"; ?> 4.解析json的两种方法

两种解析json的方法:一个是解析单一的json对象(返回字符串数组),另一个是解析带数组对象的json对象(返回ArrayList的对象)。同样采用key-value的方式获取数值,适应封装不同参数的类型。

Json.java源码

view plaincopy to clipboardprint?

1.package com.httppost.main;

2.

3.import java.util.ArrayList;

4.import java.util.HashMap;

5.

6.import org.json.JSONArray;

7.import org.json.JSONException;

8.import org.json.JSONObject;

9.

10.public class Json {

11.

12.// 解析单一的json封装,并返回字符串数组

13./**

14.* 参数说明:

15.* 1.webContent 获取的网页封装的json格式数据

16.* 2.key 以数组形式组成的json的键名称

17.* */

18.public String[] getJSON(String webContent, String[] key) {

19.int size = key.length;

20.String[] s = new String[size];

21.try {

22.JSONObject jsonObject = new JSONObject(webContent);

23.for (int j = 0; j < size; j++) {

24.s[j] = jsonObject.getString(key[j]);

25.System.out.println(key[j] + "===string==="

26.+ jsonObject.getString(key[j]));

27.}

28.} catch (JSONException e) {

29.// TODO Auto-generated catch block

30. e.printStackTrace();

31.s = null;

32.}

33.return s;

34.}

35.

36.// 获取数组型的结构,返回ArrayList>,方便listview中填充

数据

37./**

38.* 参数说明:

39.* 1.webContent 获取的网页封装的json格式数据

40.* 2.key 以数组形式组成的json的键名称 3.jsonName

41.* 封装json数组数据的json名称

42.* */

43.

44.public ArrayList> getJSONArray(String webContent,

45.String[] key, String jsonName) {

46.ArrayList> list;

47.JSONArray jsonObject;

48.try {

49.jsonObject = new JSONObject(webContent).getJSONArray(jsonName);

50.list = new ArrayList>();

51.for (int i = 0; i < jsonObject.length(); i++) {

52.JSONObject jsonObject2 = (JSONObject) jsonObject.opt(i);

53.HashMap map = new HashMap();

54.for (int j = 0; j < key.length; j++) {

55.map.put(key[j], jsonObject2.getString(key[j]));

56.System.out.println(key[j] + "==="

57.+ jsonObject2.getString(key[j]));

58.}

59.list.add(map);

60.}

61.

62.} catch (JSONException e) {

63.// TODO Auto-generated catch block

64. e.printStackTrace();

65.list = null;

66.}

67.return list;

68.}

69.}

5.线程处理服务器状态并解析相应的数据方法

android中Thread与Handler结合使用的方法,主要调用http请求,提示相应的状态,处理json数据等。

HttpThread.java源码

view plaincopy to clipboardprint?

1.package com.httppost.main;

2.

3.import java.util.ArrayList;

4.import java.util.HashMap;

5.

6.import android.app.ProgressDialog;

7.import android.content.Context;

8.import android.os.Handler;

9.import android.os.Message;

10.import android.widget.Toast;

11.

12.public class HttpThread extends Thread{

13.

14.private Context context;

15.private ProgressDialog proDialog;

16.private String url;

17.private String []key;

18.private String []value;

19.private String []jsonKey;

20.private String jsonName;

21.

22.private String []array;

23.ArrayList> list;

24.

25.public HttpThread(Context context,ProgressDialog proDialog){

26.this.context=context;

27.this.proDialog=proDialog;

28.}

29.

30.@Override

31.public void run(){

32.Message msg = handler.obtainMessage();

33.HttpPostRequest post=new HttpPostRequest();

34.int res=post.requestHttp(url, key, value);

35.String webContent=post.getWebContext();

36.msg.what=res;

37.if(res==1){

38.//解析json

39.Json json=new Json();

40.if(jsonName!=null)

41.//解析数组型的json

42.list=json.getJSONArray(webContent, jsonKey, jsonName);

43.else

44.//解析单个json值

45.array=json.getJSON(webContent, jsonKey);

46.}

47.handler.sendMessage(msg);

48.}

49.private Handler handler = new Handler() {

50.// TODO Auto-generated constructor stub

51.@Override

52.public void handleMessage(Message msg) {

53.// TODO Auto-generated method stub

54.super.handleMessage(msg);

55.int what=msg.what;

56.Http_Status_Tips status=new Http_Status_Tips();

57.//返回成功数据时

58.if(what==1){

59.//处理数组型json

60.if(list!=null){

61.int size=list.size();

62.String result="";

63.for(int i=0;i

64.int s=jsonKey.length;

65.//迭代jsonKey数组值

66.for(int j=0;j

67.result+=jsonKey[j]+":"+list.get(i).get(jsonKey[j])+"\n";

68.}

69.result+="\n";

70.}

71.Toast.makeText(context, result, Toast.LENGTH_LONG).show();

72.}

73.//处理单个字符json

74.if(array!=null){

75.int arraySize=array.length;

76.String rs="";

77.for(int k=0;k

78.rs+=jsonKey[k]+":"+array[k]+"\n";

79.}

80.Toast.makeText(context, rs, Toast.LENGTH_LONG).show();

81.}

82.}

83.//根据服务器端返回数据,自定义提示

84.else if(what==2){

85.status.setTips("自定义提示2");

86.}//根据服务器端返回数据,自定义提示

87.else if(what==3){

88.status.setTips("自定义提示3");

89.}

90.status.ShowHttpStatusTips(what, context,proDialog);

91.}

92.};

93.

94.//activity界面传递的参数

95.public String getUrl() {

96.return url;

97.}

98.

99.public void setUrl(String url) {

100.t his.url = url;

101.}

102.

103.p ublic String[] getKey() {

104.r eturn key;

105.}

106.

107.p ublic void setKey(String[] key) {

108.t his.key = key;

109.}

110.

111.p ublic String[] getValue() {

112.r eturn value;

113.}

114.

115.p ublic void setValue(String[] value) {

116.t his.value = value;

117.}

118.

119.p ublic String[] getJsonKey() {

120.r eturn jsonKey;

121.}

122.

123.p ublic void setJsonKey(String[] jsonKey) {

124.t his.jsonKey = jsonKey;

125.}

126.

127.p ublic String getJsonName() {

128.r eturn jsonName;

129.}

130.

131.p ublic void setJsonName(String jsonName) {

132.t his.jsonName = jsonName;

133.}

134.}

6.activity传递并调用线程处理方法

activity界面中调用HttpThread的方法,主要实现数值参数的传递,并返回具体的数组。通过两个按钮获取不同类型的json数据对象,获取服务器端数据的主要方法采用Toast显示,如图-1。

HttpPostActivity.java源码

view plaincopy to clipboardprint?

1.package com.httppost.main;

2.

3.import android.app.Activity;

4.import android.app.ProgressDialog;

5.import android.os.Bundle;

6.import android.view.View;

7.import android.view.View.OnClickListener;

8.import android.widget.Button;

9.

10.public class HttpPostActivity extends Activity {

11./** Called when the activity is first created. */

12.@Override

13.public void onCreate(Bundle savedInstanceState) {

14.super.onCreate(savedInstanceState);

15.setContentView(https://www.wendangku.net/doc/7513525524.html,yout.main);

16.Button jsonBtn = (Button) findViewById(R.id.get_array_json);

17.jsonBtn.setOnClickListener(jsonClick);

18.Button listBtn = (Button) findViewById(R.id.get_list_json);

19.listBtn.setOnClickListener(listClick);

20.}

21.//获取单个json封装的数据

22.OnClickListener jsonClick = new OnClickListener() {

23.

24.@Override

25.public void onClick(View v) {

26.// TODO Auto-generated method stub

27.ProgressDialog proDialog = ProgressDialog.show(v.getContext(), "",

28."正在获取数据……", true, true);

29.HttpThread jsonThread = new HttpThread(v.getContext(), proDialog);

30.String url = "http://10.0.2.2/json/json_1.php";

31.// url传递参数

32.String[] key = { "type" };

33.String[] value = { "0" };

34.// php页面返回的json键

35.String[] jsonKey = { "id", "username", "lat", "lon","type" };

36.//传递相应的参数

37.jsonThread.setUrl(url);

38.jsonThread.setKey(key);

39.jsonThread.setValue(value);

40.jsonThread.setJsonKey(jsonKey);

41.jsonThread.start();

42.}

43.};

44.//获取带数组类型的封装

45.OnClickListener listClick = new OnClickListener() {

46.

47.@Override

48.public void onClick(View v) {

49.// TODO Auto-generated method stub

50.ProgressDialog proDialog = ProgressDialog.show(v.getContext(), "",

51."正在获取数据……", true, true);

52.HttpThread jsonThread = new HttpThread(v.getContext(), proDialog);

53.String url = "http://10.0.2.2/json/json_2.php";

54.// url传递参数

55.String[] key = { "type" };

56.String[] value = { "1" };

57.// php页面返回的json键

58.String[] jsonKey = { "id", "username", "lat", "lon","type" };

59.String jsonName="json_2";

60.//传递相应的参数

61.jsonThread.setUrl(url);

62.jsonThread.setKey(key);

63.jsonThread.setValue(value);

64.jsonThread.setJsonName(jsonName);

65.jsonThread.setJsonKey(jsonKey);

66.jsonThread.start();

67.}

68.};

69.}

布局文件

main.xml

view plaincopy to clipboardprint?

1.

2.

3.android:orientation="vertical"

4.android:layout_width="fill_parent"

5.android:layout_height="wrap_content">

6.

7.android:layout_height="wrap_content"

8.android:layout_margin="12dip"

9.android:textSize="18dip"

10.android:gravity="center_horizontal"

11.android:text="post请求获取json数据"/>

12.

相关文档