一、需求文档如下:

  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']),如下:(如已经有则不必添加)

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

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

  4、添加Java代码。

public class MainActivity extends AppCompatActivity {
    private final int POST_VALUE = 1;
    String text = "";
    //这里不能获取ID,因为下面还没连接到activity_main,xml
    TextView textView;
    //--------------------------------------------定义一个Handler来处理消息----------------------------------------------
    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message message) {
            switch (message.what) {
                case POST_VALUE:
                    textView.setText(text = (text + "=" + message.obj));
                    text = "";
                    break;
                default:
                    break;
            }
        }
    };

    //-----------------------------------------------------------------------------------------------------
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textView);
        //-------------------------------------------设置符号=的监听--------------------------------------------------
        Button sendGET = (Button) findViewById(R.id.send);
        sendGET.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                   //新建一个线程,通过Message消息通知Handle对UI进行更改,现在只能在UI线程里对UI组件进行更改。
              new Thread(new Runnable() {
                        @Override
                        public void run() {
                            if(strTmp.length==2){
                   //下面三句话,将会把三个参数包装为{"para1":10,"para2":2,"opt":"div"}字段
                                CalBean tb = new CalBean(10, 2, “plus”);
                                Gson gson = new Gson();
                                //传入的参数
                                String datas = gson.toJson(tb);
                                String url = "http://108.188.129.56:8080/example/cal";
                                String data = sendPostRequest(url, datas);
                                Message message = new Message();
                                message.what = POST_VALUE;
                                message.obj = data.toString();
                                handler.sendMessage(message);
                            }
                        }
                    }).start();
                } catch (Exception e) {
                    Log.i("ok", "there must be something wrong!");
                    return;
                }
            }
        });
        //-----------------------------------------------------------------------------------------------------
    }

    public static String sendPostRequest(String url, String param) {
        HttpURLConnection httpURLConnection = null;
        OutputStream out = null; //写
        InputStream in = null;   //读
        int responseCode = 0;    //远程主机响应的HTTP状态码
        String result = "";
        try {
            URL sendUrl = new URL(url);
            httpURLConnection = (HttpURLConnection) sendUrl.openConnection();
            //post方式请求
            httpURLConnection.setRequestMethod("POST");
            //设置头部信息
            httpURLConnection.setRequestProperty("headerdata", "ceshiyongde");
            //一定要设置 Content-Type 要不然服务端接收不到参数
            httpURLConnection.setRequestProperty("Content-Type", "application/Json; charset=UTF-8");
            //指示应用程序要将数据写入URL连接,其值默认为false(是否传参)
            httpURLConnection.setDoOutput(true);
            //httpURLConnection.setDoInput(true);
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setConnectTimeout(30000); //30秒连接超时
            httpURLConnection.setReadTimeout(30000);    //30秒读取超时
            //传入参数
            out = httpURLConnection.getOutputStream();
            out.write(param.getBytes());
            out.flush(); //清空缓冲区,发送数据
            out.close();
            responseCode = httpURLConnection.getResponseCode();
            //获取请求的资源
            BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
            result = br.readLine();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Map<String, String> map = new Gson().fromJson(result,
                new TypeToken<Map<String, String>>() {
                }.getType());
        return map.get("result");
    }
}

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

public class CalBean {
    private float para1;
    private float para2;
    private String opt;

    public CalBean(float para1, float para2, String opt) {
        this.para1 = para1;
        this.para2 = para2;
        this.opt = opt;
    }

    public CalBean(){};

    public float getpara1() {
        return para1;
    }

    public float getPara2() {
        return para2;
    }

    public String getOpt() {
        return opt;
    }

    public void setpara1(float para1) {
        this.para1 = para1;
    }

    public void setPara2(float para2) {
        this.para2 = para2;
    }

    public void setOpt(String opt) {
        this.opt = opt;
    }

    @Override
    public String toString() {
        return "CalBean{" +
                "para1=" + para1 +
                ", para2=" + para2 +
                ", opt='" + opt + '\'' +
                '}';
    }
}

三、界面布局如下

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:rowCount="7"
    android:columnCount="4"
    tools:context="com.example.weihy.fourfour.MainActivity"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:id="@+id/textView"
        android:layout_columnSpan="4"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="="
        android:id="@+id/send"
        />
</GridLayout> 

四、打开网络请求

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.weihy.fourfour">
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</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. Nokia N9开启开发者模式

    最近淘宝买个二手Nokia N9,纯粹是好奇meego系统. 到手了开始折腾,官方源早关闭了,导致无法开启开发者模式,没有权限很不方便.翻了翻dospy论坛的帖子,发现了n9repomirror_0. ...

  2. UITableView常用属性和方法 - 永不退缩的小白菜

    UITableView常用属性和方法 - 永不退缩的小白菜 时间 2014-05-27 01:21:00  博客园精华区原文  http://www.cnblogs.com/zhaofucheng11 ...

  3. Swift—属性观察者-备

    为了监听属性的变化,Swift提供了属性观察者.属性观察者能够监听存储属性的变化,即便变化前后的值相同,它们也能监听到. 属性观察者主要有以下两个: willSet:观察者在修改之前调用. didSe ...

  4. Express4+Mongodb极简入门实例

    一.准备工作: 1.启动mongodb:bin目录下运行 2.在test数据库里插入一条数据: 二.正式开始: 1.通过应用生成器工具 express 快速创建一个应用的骨架,参考Express中文网 ...

  5. android特效

    http://houxiyang.com/archives/89/ http://blog.csdn.net/hjj0212/article/details/8535817 http://www.li ...

  6. PHP-FPM的STATUS显示配置

    希望能在优化PHP-FPM方面作一个改进.. 参考URL: http://www.ttlsa.com/php/use-php-fpm-status-page-detail/ http://www.li ...

  7. How to run Tomcat without root privileges? 常规用户使用tomcat的80端口

    How to run Tomcat without root privileges? 1. The best way is to use jsvc, available as part of the  ...

  8. 【转】将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)

    原文网址:http://blog.csdn.net/bokee/article/details/6633193 工欲善其事,必先利其器.一个强大的开发环境可以大大提高工作效率.好吧,我知道这是废话.. ...

  9. Jetty直接调试,不用部署,不用弄一些杂七杂八的设置

    以前调试web程序的,搭建Tomcat实在是费劲,就想找一个比较简单的方式,我就想调试一下我写的某一个servlet形式,看到<how Tomcat works>这本书,才明白确实可以,不 ...

  10. virsh -c exs://ip/?no_verify=1 --readonly nodeinfo