




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
android采用post方式获取服务器数据地址:/archives/464Add a comment1,597 viewsNovember 11th, 2011Charlieandroid,http,jsonandroid 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. packagecom.httppost.main;2. 3. importjava.io.IOException;4. importjava.io.InterruptedIOException;5. importjava.io.UnsupportedEncodingException;6. importjava.util.ArrayList;7. importjava.util.List;8. 9. importorg.apache.http.HttpEntity;10. importorg.apache.http.HttpResponse;11. importorg.apache.http.client.ClientProtocolException;12. importorg.apache.http.client.entity.UrlEncodedFormEntity;13. importorg.apache.http.client.methods.HttpPost;14. importorg.apache.http.conn.ConnectTimeoutException;15. importorg.apache.http.impl.client.DefaultHttpClient;16. importorg.apache.http.message.BasicNameValuePair;17. importorg.apache.http.params.HttpConnectionParams;18. tocol.HTTP;19. importorg.apache.http.util.EntityUtils;20. 21. publicclassHttpPostRequest22. 23. privateStringwebContext;24. /返回请求内容25. publicStringgetWebContext()26. returnwebContext;27. 28. publicvoidsetWebContext(StringwebContext)29. this.webContext=webContext;30. 31. /该函数返回服务器访问的各种状态,并通过webContext传递获取的文本值32. /*33. *参数说明34. *url访问的网络地址35. *key传递参数的名称36. *value传递参数的值37. *key与value数组长度对应,即一对键值对,这样可以不限制参数传递的个数38. */39. publicintrequestHttp(Stringurl,Stringkey,Stringvalue)40. /TODOAuto-generatedmethodstub41. intstatus=0;42. DefaultHttpClientmHttpClient=newDefaultHttpClient();43. HttpPostmPost=newHttpPost(url);44. Listpairs=newArrayList();45. intsize=key.length;46. for(inti=0;isize;i+)47. pairs.add(newBasicNameValuePair(keyi,valuei);48. 49. try50. mPost.setEntity(newUrlEncodedFormEntity(pairs,HTTP.UTF_8);51. catch(UnsupportedEncodingExceptione1)52. /TODOAuto-generatedcatchblock53. e1.printStackTrace();54. 55. try56. /Socket超时设置60s57. mHttpClient.getParams().setIntParameter(HttpConnectionParams.SO_TIMEOUT,60000);58. /连接超时60s59. mHttpClient.getParams().setIntParameter(HttpConnectionParams.CONNECTION_TIMEOUT,60000);60. HttpResponseresponse=mHttpClient.execute(mPost);61. intres=response.getStatusLine().getStatusCode();62. if(res=200)63. HttpEntityentity=response.getEntity();64. if(entity!=null)65. Stringinfo=EntityUtils.toString(entity);66. setWebContext(info);67. status=1;68. 69. elseif(res=404)70. status=404;71. elseif(res=500)72. status=500;73. 74. catch(ClientProtocolExceptione)75. /TODOAuto-generatedcatchblock76. e.printStackTrace();77. status=900;78. catch(ConnectTimeoutExceptione)79. /TODOAuto-generatedcatchblock80. e.printStackTrace();81. status=901;82. catch(InterruptedIOExceptione)83. /TODOAuto-generatedcatchblock84. e.printStackTrace();85. status=902;86. catch(IOExceptione)87. /TODOAuto-generatedcatchblock88. e.printStackTrace();89. status=903;90. 91. returnstatus;92. 93. 2.获取服务器端返回http状态的提示及处理方法根据服务器返回的状态提示相应的信息的类,可以根据实际需要自定义提示状态,例如登录,注册等提示。Http_Status_Tips.java源码:view plaincopy to clipboardprint?1. packagecom.httppost.main;2. 3. importandroid.app.ProgressDialog;4. importandroid.content.Context;5. importandroid.widget.Toast;6. 7. publicclassHttp_Status_Tips8. /服务器端返回的状态提示9. publicstaticfinalStringHTTP_0=其他错误;10. publicstaticfinalStringHTTP_1=;11. publicstaticfinalStringHTTP_404=404错误,请求链接无效;12. publicstaticfinalStringHTTP_500=网络500错误,服务器端程序出错;13. publicstaticfinalStringHTTP_900=网络传输协议出错;14. publicstaticfinalStringHTTP_901=连接超时;15. publicstaticfinalStringHTTP_902=网络中断;16. publicstaticfinalStringHTTP_903=网络数据流传输出错;17. publicstaticfinalStringHTTP_UNKONW=未知的错误;18. 19. /自定义的提示20. privateStringtips;21. 22. publicvoidShowHttpStatusTips(intstatus,Contextcontext,ProgressDialogproDialog)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. publicStringgetTips()64. returntips;65. 66. publicvoidsetTips(Stringtips)67. this.tips=tips;68. 69. 70. 3.服务器端封装json数据的方法采用php语言封装json的两种格式,数据可以是从数据库返回的数组,本例只采用简单的赋值方式返回数据。$_POSTtype对应的是post的请求方式获取参数值。(1.)封装单个json对象json_1.phpview plaincopy to clipboardprint?1. 2,7. 8. username=william,9. 10. lat=113.09,11. 12. lon=22.2982,13. 14. type=传递参数:.$type15. );16. echojson_encode($arr);17. ?(2.)封装带数组的json对象json_2.phpview plaincopy to clipboardprint?1. 1,10. 11. username=charlie,12. 13. lat=113.09832,14. 15. lon=22.29322,16. 17. type=传递参数:.$type18. );19. $b=array(20. 21. id=2,22. 23. username=william,24. 25. lat=113.09,26. 27. lon=22.2982,28. 29. type=传递参数:.$type30. );31. /将两个数组合并成一个数组32. array_push($arr,$a);33. array_push($arr,$b);34. /封装成json_2的json35. echojson_2:.json_encode($arr).;?4.解析json的两种方法两种解析json的方法:一个是解析单一的json对象(返回字符串数组),另一个是解析带数组对象的json对象(返回ArrayList的对象)。同样采用key-value的方式获取数值,适应封装不同参数的类型。Json.java源码view plaincopy to clipboardprint?1. packagecom.httppost.main;2. 3. importjava.util.ArrayList;4. importjava.util.HashMap;5. 6. importorg.json.JSONArray;7. importorg.json.JSONException;8. importorg.json.JSONObject;9. 10. publicclassJson11. 12. /解析单一的json封装,并返回字符串数组13. /*14. *参数说明:15. *1.webContent获取的网页封装的json格式数据16. *2.key以数组形式组成的json的键名称17. */18. publicStringgetJSON(StringwebContent,Stringkey)19. intsize=key.length;20. Strings=newStringsize;21. try22. JSONObjectjsonObject=newJSONObject(webContent);23. for(intj=0;jsize;j+)24. sj=jsonObject.getString(keyj);25. System.out.println(keyj+=string=26. +jsonObject.getString(keyj);27. 28. catch(JSONExceptione)29. /TODOAuto-generatedcatchblock30. e.printStackTrace();31. s=null;32. 33. returns;34. 35. 36. /获取数组型的结构,返回ArrayListHashMap,方便listview中填充数据37. /*38. *参数说明:39. *1.webContent获取的网页封装的json格式数据40. *2.key以数组形式组成的json的键名称3.jsonName41. *封装json数组数据的json名称42. */43. 44. publicArrayListHashMapgetJSONArray(StringwebContent,45. Stringkey,StringjsonName)46. ArrayListHashMaplist;47. JSONArrayjsonObject;48. try49. jsonObject=newJSONObject(webContent).getJSONArray(jsonName);50. list=newArrayListHashMap();51. for(inti=0;ijsonObject.length();i+)52. JSONObjectjsonObject2=(JSONObject)jsonObject.opt(i);53. HashMapmap=newHashMap();54. for(intj=0;jkey.length;j+)55. map.put(keyj,jsonObject2.getString(keyj);56. System.out.println(keyj+=57. +jsonObject2.getString(keyj);58. 59. list.add(map);60. 61. 62. catch(JSONExceptione)63. /TODOAuto-generatedcatchblock64. e.printStackTrace();65. list=null;66. 67. returnlist;68. 69. 5.线程处理服务器状态并解析相应的数据方法android中Thread与Handler结合使用的方法,主要调用http请求,提示相应的状态,处理json数据等。HttpThread.java源码view plaincopy to clipboardprint?1. packagecom.httppost.main;2. 3. importjava.util.ArrayList;4. importjava.util.HashMap;5. 6. importandroid.app.ProgressDialog;7. importandroid.content.Context;8. importandroid.os.Handler;9. importandroid.os.Message;10. importandroid.widget.Toast;11. 12. publicclassHttpThreadextendsThread13. 14. privateContextcontext;15. privateProgressDialogproDialog;16. privateStringurl;17. privateStringkey;18. privateStringvalue;19. privateStringjsonKey;20. privateStringjsonName;21. 22. privateStringarray;23. ArrayListHashMaplist;24. 25. publicHttpThread(Contextcontext,ProgressDialogproDialog)26. this.context=context;27. Dialog=proDialog;28. 29. 30. Override31. publicvoidrun()32. Messagemsg=handler.obtainMessage();33. HttpPostRequestpost=newHttpPostRequest();34. intres=post.requestHttp(url,key,value);35. StringwebContent=post.getWebContext();36. msg.what=res;37. if(res=1)38. /解析json39. Jsonjson=newJson();40. if(jsonName!=null)41. /解析数组型的json42. list=json.getJSONArray(webContent,jsonKey,jsonName);43. else44. /解析单个json值45. array=json.getJSON(webContent,jsonKey);46. 47. handler.sendMessage(msg);48. 49. privateHandlerhandler=newHandler()50. /TODOAuto-generatedconstructorstub51. Override52. publicvoidhandleMessage(Messagemsg)53. /TODOAuto-generatedmethodstub54. super.handleMessage(msg);55. intwhat=msg.what;56. Http_Status_Tipsstatus=newHttp_Status_Tips();57. /返回成功数据时58. if(what=1)59. /处理数组型json60. if(list!=null)61. intsize=list.size();62. Stringresult=;63. for(inti=0;isize;i+)64. ints=jsonKey.length;65. /迭代jsonKey数组值66. for(intj=0;js;j+)67. result+=jsonKeyj+:+list.get(i).get(jsonKeyj)+n;68. 69. result+=n;70. 71. Toast.makeText(context,result,Toast.LENGTH_LONG).show();72. 73. /处理单个字符json74. if(array!=null)75. intarraySize=array.length;76. Stringrs=;77. for(intk=0;karraySize;k+)78. rs+=jsonKeyk+:+arrayk+n;79. 80. Toast.makeText(context,rs,Toast.LENGTH_LONG).show();81. 82. 83. /根据服务器端返回数据,自定义提示84. elseif(what=2)85. status.setTips(自定义提示2);86. /根据服务器端返回数据,自定义提示87. elseif(what=3)88. status.setTips(自定义提示3);89. 90. status.ShowHttpStatusTips(what,context,proDialog);91. 92. ;93. 94. /activity界面传递的参数95. publicStringgetUrl()96. returnurl;97. 98. 99. publicvoidsetUrl(Stringurl)100. this.url=url;101. 102. 103. publicStringgetKey()104. returnkey;105. 106. 107. publicvoidsetKey(Stringkey)108. this.key=key;109. 110. 111. publicStringgetValue()112. returnvalue;113. 114. 115. publicvoidsetValue(Stringvalue)116. this.value=value;117. 118. 119. publicStringgetJsonKey()120. returnjsonKey;121. 122. 123. publicvoidsetJsonKey(StringjsonKey)124. this.jsonKey=jsonKey;125. 126. 127. publicStringgetJsonName()128. returnjsonName;129. 130. 131. publicvoidsetJsonName(StringjsonName)132. this.jsonName=jsonName;133. 134. 6.activity传递并调用线程处理方法activity界面中调用HttpThread的方法,主要实现数值参数的传递,并返回具体的数组。通过两个按钮获取不同类型的json数据对象,获取服务器端数据的主要方法采用Toast显示,如图-1。HttpPostActivity.java源码view plaincopy to clipboardprint?1. packagecom.httppost.main;2. 3. importandroid.app.Activity;4. importandroid.app.ProgressDialog;5. importandroid.os.Bundle;6. importandroid.view.View;7. importandroid.view.View.OnClickListener;8. importandroid.widget.Button;9. 10. publicclassHttpPostActivityextendsActivity11. /*Calledwhentheactivityisfirstcreated.*/12. Override13. publicvoidonCreate(BundlesavedInstanceState)14. super.onCreate(savedInstanceState);15. setContentView(R.layout.main);16. ButtonjsonBtn=(Button)findViewById(R.id.get_array_json);17. jsonBtn.setOnClickListener(jsonClick);18. ButtonlistBtn=(Button)findViewById(R.id.get_list_json);19. listBtn.setOnClickListener(listClick);20. 21. /获取单个json封装的数据22. OnClickListenerjsonClick=newOnClickListener()23. 24. Override25. publicvoidonClick(Viewv)26. /TODOAuto-generatedmethodstub27. ProgressDialo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业设计与现代制造业的关系
- 工业节能技术与发展方向
- 工作压力下的营养补充策略
- 工业设备维护与优化管理
- 工作空间环境优化以增强工作成效
- 工作场所的变革与创新
- 工程检测中水泥检测技术培训
- 工程机械结构设计与分析
- 工程设计中智能化技术的应用前景
- 工程机械的结构设计与可靠性分析
- 北京市建设工程施工现场安全生产标准化管理图集(2019版)
- 核医学工作中辐射防护知识课件
- DB32T 4644.2-2024 从业人员健康检查 第2部分:健康检查技术规范
- 肺结核大咯血的护理查房课件
- 教师晋升副高职称申请书范文
- 营区物业服务投标方案(技术标)
- 苏教版四年级数学下册期末试题及答案5套
- 数据结构第2章-线性表
- 电动卷扬机使用安全措施
- 铁路空心墩任意两个截面砼方量计算自编公式
- 中建有限空间专项施工方案
评论
0/150
提交评论