运行有问题或需要源码请点赞关注收藏后评论区留言~~~

一、POST方式调用HTTP接口

POST方式把接口地址与请求报文分开,允许使用自定义的报文格式,由此扩大了该方式的应用场景。POST请求与GET请求主要有三处编码差异

1:在调用setRequestMethod方法时  请求方式填POST而非GET

2:POST方式务必调用setDoOutput方法并设置true,表示准备让连接执行输出操作

3:连接成功之后,要向连接对象的输出流写入请求报文的字节数据

接下来通过一个实例,演示如何在App开发中发送POST请求来更新应用版本。

此处要搭建HTTP服务器,过程省略不表,读者可自行上网查询

完成服务器搭建之后,通过电脑浏览器访问Web服务的默认首页,可以在命令行查找电脑的无线网址,如果能够正常打开网页,就表示在笔记本电脑上搭建好了HTTP服务器  效果如下

可自行在下拉框中选择要更新的应用

连接真机测试效果更好

代码如下

Java类

package com.example.chapter14;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;import com.example.chapter14.bean.PackageInfo;
import com.example.chapter14.constant.ApkConstant;
import com.example.chapter14.task.CheckUpdateTask;
import com.example.chapter14.task.req.CheckUpdateReq;
import com.example.chapter14.task.resp.CheckUpdateResp;
import com.google.gson.Gson;public class HttpPostActivity extends AppCompatActivity implements CheckUpdateTask.OnCheckUpdateListener {private static final String TAG = "HttpPostActivity";private Spinner sp_app_name; // 应用名称的下拉框private ImageView iv_app;private TextView tv_app_result;private boolean isFirstSelect = true; // 是否首次选择@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_http_post);iv_app = findViewById(R.id.iv_app);tv_app_result = findViewById(R.id.tv_app_result);initAppSpinner(); // 初始化应用名称的下拉框}// 初始化应用名称的下拉框private void initAppSpinner() {ArrayAdapter<String> apkNameAdapter = new ArrayAdapter<String>(this,R.layout.item_select, ApkConstant.NAME_ARRAY);sp_app_name = findViewById(R.id.sp_app_name);sp_app_name.setPrompt("请选择要更新的应用");sp_app_name.setAdapter(apkNameAdapter);sp_app_name.setOnItemSelectedListener(new AppNameSelectedListener());sp_app_name.setSelection(0);}class AppNameSelectedListener implements AdapterView.OnItemSelectedListener {public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {if (isFirstSelect) { // 刚打开页面时不需要执行下载动作isFirstSelect = false;return;}queryAppInfo(arg2); // 查询应用的详细信息}public void onNothingSelected(AdapterView<?> arg0) {}}// 查询应用的详细信息private void queryAppInfo(int pos) {iv_app.setImageResource(ApkConstant.ICON_ARRAY[pos]); // 设置图像视图的资源图片CheckUpdateReq req = new CheckUpdateReq(); // 创建检查更新的请求对象req.package_list.add(new PackageInfo(ApkConstant.PACKAGE_ARRAY[pos]));String content = new Gson().toJson(req); // 把检查更新的请求对象转换为json字符串CheckUpdateTask task = new CheckUpdateTask(); // 创建一个检查应用更新的异步任务task.setCheckUpdateListener(this); // 设置应用更新检查的监听器task.execute(content); // 把应用更新检查任务加入到处理队列}// 在结束应用更新检查时触发@Overridepublic void finishCheckUpdate(String resp) {if (TextUtils.isEmpty(resp)) {Toast.makeText(this, "应用检查更新失败", Toast.LENGTH_SHORT).show();return;}// 把JSON串转换为对应结构的实体对象CheckUpdateResp checkResp = new Gson().fromJson(resp, CheckUpdateResp.class);if (checkResp!=null && checkResp.package_list!=null && checkResp.package_list.size()>0) {PackageInfo info = checkResp.package_list.get(0);String desc = String.format("应用检查更新结果如下:\n应用名称:%s\n应用包名:%s\n最新版本:%s\n下载地址:%s",info.app_name, info.package_name, info.new_version, info.download_url);tv_app_result.setText(desc); // 显示当前选中应用的检查更新结果}}}

APK类

package com.example.chapter14.constant;import com.example.chapter14.R;public class ApkConstant {public static String[] NAME_ARRAY = {"爱奇艺", "酷狗音乐", "美图秀秀", "微信", "淘宝", "QQ"};public static String[] PACKAGE_ARRAY = {"com.qiyi.video", "com.kugou.android", "com.mt.mtxx.mtxx","com.tencent.mm", "com.taobao.taobao", "com.tencent.mobileqq"};public static int[] ICON_ARRAY = {R.drawable.icon_aiqiyi, R.drawable.icon_kugou, R.drawable.icon_meitu,R.drawable.icon_weixin, R.drawable.icon_taobao, R.drawable.icon_qq};public static String[] URL_ARRAY = {"https://3g.lenovomm.com/w3g/yydownload/com.qiyi.video/60020","https://3g.lenovomm.com/w3g/yydownload/com.kugou.android/60020","https://3g.lenovomm.com/w3g/yydownload/com.mt.mtxx.mtxx/60020","https://3g.lenovomm.com/w3g/yydownload/com.tencent.mm/60020","https://3g.lenovomm.com/w3g/yydownload/com.taobao.taobao/60020","https://3g.lenovomm.com/w3g/yydownload/com.tencent.mobileqq/60020"};}

bean类

package com.example.chapter14.bean;public class PackageInfo {public String app_name; // 应用名称public String package_name; // 应用包名public String download_url; // 下载地址public String new_version; // 新版本号public PackageInfo() {app_name = "";package_name = "";download_url = "";new_version = "";}public PackageInfo(String package_name) {this.package_name = package_name;}}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="5dp" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp" ><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center"android:text="请选择要更新的应用:"android:textColor="@color/black"android:textSize="17sp" /><Spinnerandroid:id="@+id/sp_app_name"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:spinnerMode="dialog" /></LinearLayout><ImageViewandroid:id="@+id/iv_app"android:layout_width="match_parent"android:layout_height="50dp"android:scaleType="fitCenter" /><TextViewandroid:id="@+id/tv_app_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="@color/black"android:textSize="17sp" /></LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~ 

Android Studio App开发之网络通信中使用POST方式调用HTTP接口实现应用更新功能(附源码 超详细必看)相关推荐

  1. Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)

     运行有问题或需要源码请点赞关注收藏后评论区留言~~ 显示Intent和隐式Intent Intent是各个组件之间的信息沟通的桥梁,既能在Activity之间沟通,又能在Activity与Servi ...

  2. Android Studio App开发中高级控件下拉列表Spinner的讲解及实战(附源码 超详细必看)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.下拉框Spinner Spinner是下拉框控件,它用于从一串列表中选择某项,其功能类似于单选按钮的组合,下拉列表的展示方式有两种,一种是在当 ...

  3. 【Android App】物联网中指南针、计步器、感光器、陀螺仪的讲解及实战演示(附源码 超详细必看)

    需要源码请点赞关注收藏后评论区留言~~~ 一.指南针-磁场传感器 顾名思义,指南针只要找到朝南的方向就好了. 可是在App中并非使用一个方向传感器这么简单,事实上单独的方向传感器已经弃用,取而代之的是 ...

  4. Android App开发实战项目之购物车(附源码 超详细必看)

    需要源码请点赞关注收藏后评论区留言~~~ 一.需求描述 电商App的购物车可谓是司空见惯了,可以知道购物车除了底部有一个结算行,其余部分主要是已加入购物车的商品列表,然后每个商品左边是商品小图,右边是 ...

  5. 【Python自然语言处理】隐马尔可夫模型中维特比(Viterbi)算法解决商务选择问题实战(附源码 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.统计分词 统计分词基本逻辑是把每个词语看做由单字组成,利用统计学原理计算连接字在不同文本中出现的次数,以此判断相连字属于特定词语的概率. 二.隐马尔可 ...

  6. Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)

    运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~ 一.循环视图RecyclerView 尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化 ...

  7. Android App开发动画特效之实现百叶窗动画和马赛克动画效果实战演示(附源码和演示视频 可直接使用)

    需要图片集和源码请点赞关注收藏后评论区留言~~~ 一.实现百叶窗动画 合理运用图层规则可以实现酷炫的动画效果,比如把图片分割成一条一条,接着每条都逐渐展开,这便产生了百叶窗动画,把图片等分为若干小方格 ...

  8. android:自己动手编译Android源码(超详细)

    自己动手编译Android源码(超详细) 涅槃1992 2016.06.20 02:12* 字数 4330 阅读 86819评论 89喜欢 339赞赏 7 在Android Studio代码调试一文中 ...

  9. C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码...

    C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 原文:C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码 前言 系列 ...

最新文章

  1. linux终端密码星星,如何在Ubuntu终端中显示密码星号
  2. NIX***检测方法
  3. PCRE函数简介和使用示例
  4. topcoder srm 711 div1 -3
  5. Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
  6. 深度学习框架Caffe, MXNet, TensorFlow, Torch, CNTK性能测试报告
  7. Java学习进阶—高级编程
  8. 万万没想到,AI算法开发、OCR应用已经进入零门槛时代!
  9. php方便,两个方便测试PHP特性的小程序
  10. mysql无法通过工具连接_MySQL 8.0版本无法使用 node、Navicat等三方工具连接的问题...
  11. oracle 10g下载百度云地址
  12. hive sql列转行
  13. 浅谈机器人比赛中的系统工程和组织管理
  14. 计算机组装硬件配置清单,组装电脑配置清单
  15. USB 3.0 对无线鼠标的干扰问题
  16. 傲梅备份服务器系统,傲梅轻松备份如何还原系统的详细解析
  17. 什么样的公司程序员待遇好?
  18. 什么是企业管理咨询服务?
  19. Polygon已在测试网中实现EIP-1559
  20. Bless You Autocorrect!(字典树上建图)

热门文章

  1. 汽车电子点火控制系统
  2. java键盘键入法_【java基础】键盘键入内容
  3. 不是这个社会浮躁了,是我们的眼睛浮躁了。
  4. python 人工智能编程_最适合人工智能开发的5种编程语言
  5. 新东方雅思词汇---6.2、重音在词根上,不在前后缀(名词除外)
  6. 防老人走失新方法:衣服上缝二维码 走失可扫码回家
  7. win10 引导系统损坏 和 bios设置
  8. Java面试题库,极客时间百度云盘百度网盘
  9. Java的excel去除空行(包括带有格式的空行)
  10. bas64图片加密解密