一、需求文档如下:

  URL:http://108.188.129.56:8080/example/cal

  请求格式: {"para1":10,"para2":2,"opt":"div"}

  请求参数说明:para1表示第一个参数,para2表示第二个参数,opt表示四则运算操作,可取的值为plus、sub、mult、div,分别对应加、减、乘、除

  响应格式: {"code":0,"result":5}

  响应参数说明:
  code为响应码,0表示正常,其他值表示接口调用异常(例如:-1表示参数格式不正确,1表示除数为0等等)

二、Java代码如下

  1、切换Android Studio视图,从Android切换到Project,然后将Gson包放到...\app\libs文件夹下。

  2、打开app-src-build.gradle,加上依赖语句:compile fileTree(dir: 'libs', include: ['*.jar']),如下:(如已经有则不必添加)

  1. dependencies {
  2. compile fileTree(dir: 'libs', include: ['*.jar'])
  3. androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  4. exclude group: 'com.android.support', module: 'support-annotations'
  5. })
  6. compile 'com.android.support:appcompat-v7:25.1.0'
  7. testCompile 'junit:junit:4.12'
  8. }

  3、然后代码编辑界面的上方会出现提示:Gradle Files 已经被修改,需要同步。点击右上角的Sync now即可。

  4、添加Java代码。

  1. public class MainActivity extends AppCompatActivity {
  2. private final int POST_VALUE = 1;
  3. String text = "";
  4. //这里不能获取ID,因为下面还没连接到activity_main,xml
  5. TextView textView;
  6. //--------------------------------------------定义一个Handler来处理消息----------------------------------------------
  7. final Handler handler = new Handler() {
  8. @Override
  9. public void handleMessage(Message message) {
  10. switch (message.what) {
  11. case POST_VALUE:
  12. textView.setText(text = (text + "=" + message.obj));
  13. text = "";
  14. break;
  15. default:
  16. break;
  17. }
  18. }
  19. };
  20.  
  21. //-----------------------------------------------------------------------------------------------------
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_main);
  26. textView = (TextView) findViewById(R.id.textView);
  27. //-------------------------------------------设置符号=的监听--------------------------------------------------
  28. Button sendGET = (Button) findViewById(R.id.send);
  29. sendGET.setOnClickListener(new View.OnClickListener() {
  30. @Override
  31. public void onClick(View view) {
  32. try {
  33. //新建一个线程,通过Message消息通知Handle对UI进行更改,现在只能在UI线程里对UI组件进行更改。
  34.               new Thread(new Runnable() {
  35. @Override
  36. public void run() {
  37. if(strTmp.length==2){
  38.                    //下面三句话,将会把三个参数包装为{"para1":10,"para2":2,"opt":"div"}字段
  39. CalBean tb = new CalBean(10, 2, plus”);
  40. Gson gson = new Gson();
  41. //传入的参数
  42. String datas = gson.toJson(tb);
  43. String url = "http://108.188.129.56:8080/example/cal";
  44. String data = sendPostRequest(url, datas);
  45. Message message = new Message();
  46. message.what = POST_VALUE;
  47. message.obj = data.toString();
  48. handler.sendMessage(message);
  49. }
  50. }
  51. }).start();
  52. } catch (Exception e) {
  53. Log.i("ok", "there must be something wrong!");
  54. return;
  55. }
  56. }
  57. });
  58. //-----------------------------------------------------------------------------------------------------
  59. }
  60.  
  61. public static String sendPostRequest(String url, String param) {
  62. HttpURLConnection httpURLConnection = null;
  63. OutputStream out = null; //写
  64. InputStream in = null; //读
  65. int responseCode = 0; //远程主机响应的HTTP状态码
  66. String result = "";
  67. try {
  68. URL sendUrl = new URL(url);
  69. httpURLConnection = (HttpURLConnection) sendUrl.openConnection();
  70. //post方式请求
  71. httpURLConnection.setRequestMethod("POST");
  72. //设置头部信息
  73. httpURLConnection.setRequestProperty("headerdata", "ceshiyongde");
  74. //一定要设置 Content-Type 要不然服务端接收不到参数
  75. httpURLConnection.setRequestProperty("Content-Type", "application/Json; charset=UTF-8");
  76. //指示应用程序要将数据写入URL连接,其值默认为false(是否传参)
  77. httpURLConnection.setDoOutput(true);
  78. //httpURLConnection.setDoInput(true);
  79. httpURLConnection.setUseCaches(false);
  80. httpURLConnection.setConnectTimeout(30000); //30秒连接超时
  81. httpURLConnection.setReadTimeout(30000); //30秒读取超时
  82. //传入参数
  83. out = httpURLConnection.getOutputStream();
  84. out.write(param.getBytes());
  85. out.flush(); //清空缓冲区,发送数据
  86. out.close();
  87. responseCode = httpURLConnection.getResponseCode();
  88. //获取请求的资源
  89. BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
  90. result = br.readLine();
  91. } catch (Exception e) {
  92. e.printStackTrace();
  93. }
  94. Map<String, String> map = new Gson().fromJson(result,
  95. new TypeToken<Map<String, String>>() {
  96. }.getType());
  97. return map.get("result");
  98. }
  99. }

  5、在MainActivity同级目录下新建一个包Bean,在包下新建一个CalBean的Java类,添加如下代码。

  1. public class CalBean {
  2. private float para1;
  3. private float para2;
  4. private String opt;
  5.  
  6. public CalBean(float para1, float para2, String opt) {
  7. this.para1 = para1;
  8. this.para2 = para2;
  9. this.opt = opt;
  10. }
  11.  
  12. public CalBean(){};
  13.  
  14. public float getpara1() {
  15. return para1;
  16. }
  17.  
  18. public float getPara2() {
  19. return para2;
  20. }
  21.  
  22. public String getOpt() {
  23. return opt;
  24. }
  25.  
  26. public void setpara1(float para1) {
  27. this.para1 = para1;
  28. }
  29.  
  30. public void setPara2(float para2) {
  31. this.para2 = para2;
  32. }
  33.  
  34. public void setOpt(String opt) {
  35. this.opt = opt;
  36. }
  37.  
  38. @Override
  39. public String toString() {
  40. return "CalBean{" +
  41. "para1=" + para1 +
  42. ", para2=" + para2 +
  43. ", opt='" + opt + '\'' +
  44. '}';
  45. }
  46. }

三、界面布局如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:rowCount="7"
  8. android:columnCount="4"
  9. tools:context="com.example.weihy.fourfour.MainActivity"
  10. >
  11.  
  12. <TextView
  13. android:layout_width="match_parent"
  14. android:layout_height="100dp"
  15. android:id="@+id/textView"
  16. android:layout_columnSpan="4"
  17. />
  18. <Button
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="="
  22. android:id="@+id/send"
  23. />
  24. </GridLayout> 

四、打开网络请求

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.weihy.fourfour">
  4. <uses-permission android:name="android.permission.INTERNET"/>
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@mipmap/ic_launcher"
  8. android:label="@string/app_name"
  9. android:supportsRtl="true"
  10. android:theme="@style/AppTheme">
  11. <activity android:name=".MainActivity">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. </application>
  18.  
  19. </manifest>

五、分析

观察发现,gson.toJson的作用就是把para1=102.0等号左边的加上转意符\弄成有“”扩着的,在等号右边的有‘’号的话,也加上\弄成双引号“”。

花括号不会有引号扩着,只有最外边的大引号左右扩住全部,CalBean这几个字好像没什么用,修改掉也没什么异常。

【Android】使用Gson和Post请求和服务器通信的更多相关文章

  1. Android操作HTTP实现与服务器通信(转)

    Android操作HTTP实现与服务器通信   本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方 ...

  2. Android 采用post方式提交数据到服务器

    接着上篇<Android 采用get方式提交数据到服务器>,本文来实现采用post方式提交数据到服务器 首先对比一下get方式和post方式: 修改布局: <LinearLayout ...

  3. 客户端(android,ios)与服务器通信

    android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏 ...

  4. Android操作HTTP实现和服务器通信

    众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HT ...

  5. Android版本28使用http请求

    Android版本28使用http请求报错not permitted by network security policy android模拟器调试登录的时候报错 CLEARTEXT communic ...

  6. Android版本28使用http请求报错not permitted by network security policy

    Android版本28使用http请求报错not permitted by network security policy android模拟器调试登录的时候报错 CLEARTEXT communic ...

  7. HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection

    查看原文:http://blog.csdn.net/sinat_29912455/article/details/51122286 1客户端连接服务器实现内部的原理 GET方式和POST方式的差别 H ...

  8. Android+Tomcat通过http获取本机服务器资源

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  9. Android操作HTTP实现与服务器通信

    (转自http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html) 本示例以Servlet为例,演示Android与Servlet ...

随机推荐

  1. GO逆转字符串

    package main import "fmt" func main(){ str:="foobar" a:=[]rune(str) ,len(a)-;i&l ...

  2. 如何用VS2010打开VS2012编辑的项目

    找到打开项目的开始图标:,右键点击,选择有文本编辑器打开,用下面的语句将文件里面的前两句替换掉.​Microsoft Visual Studio Solution File, Format Versi ...

  3. Linux企业级项目实践之网络爬虫(5)——处理配置文件

    配置文件在Linux下使用得非常普遍,但是Linux下没有统一个配置文件标准. 我们把配置文件的规则制定如下: 1.把"#"视作注释开始 2.所有的配置项都都是以键值对的形式出现 ...

  4. Delphi 调试 通过BreakPoint

    1.打个断点, 如下图 2. 在断点上,邮件,如下图 3. 弹出一个窗体 ,如下图 在 condition 中写条件就可以了.  这样就可以按你假设的条件来进行了,方便.

  5. cf437B The Child and Set

    B. The Child and Set time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. poj3358:欧拉定理

    又是一道用欧拉定理解的题..嗯,关键还是要建好方程,注意一些化简技巧 题目大意: 给定一个由 p / q 生成的循环小数,求此循环小数在二进制表示下的最小循环节以及不是循环节的前缀 思路: 小数化为二 ...

  7. poj 2226 Muddy Fields(最小点覆盖+巧妙构图)

      Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= ...

  8. tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式

     tool - 支持TestLink 1.93,将excel格式用例转化成可以导入的xml格式  https://github.com/zhangzheyuk/CaseConvert

  9. 字典树-百度之星-Xor Sum

    Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...

  10. 利用Excel批量高速发送电子邮件

    利用Excel批量高速发送电子邮件,分两步: 1. 准备待发送的数据: a.) 打开Excel,新建Book1.xlsx b.) 填入以下的内容, 第一列:接收人,第二列:邮件标题,第三列:正文,第四 ...