Android网络编程,HTTP请求和Json解析

这篇具有很好参考价值的文章主要介绍了Android网络编程,HTTP请求和Json解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 基本网络请求类HttpURLConnection

以下代码模拟了点击按钮请求百度的网页源码:其中需要注意的是Android在API27之后不再支持明文访问HTTP,需要在manifest文件中配置属性允许使用明文访问,并且Url需要使用https

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/web_btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点击获取百度页面"
        android:textSize="20sp"
        android:layout_marginBottom="5dp"
        android:onClick="getHttpText"/>
<!--<WebView-->
<!--        android:id="@+id/webview1"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent"></WebView>-->

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/web_tv1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />


    </ScrollView>

</LinearLayout>

字节流转换字符串工具类:

public class HttpInputStreamParse {

    public static String parseInput(InputStream in) throws IOException {

        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String temp;
        while((temp = br.readLine())!= null){
            sb.append(temp);
        }
        return sb.toString();
    }
}

主类.java:

public class MainActivity extends AppCompatActivity {

    private static final String HTTP_ADDRESS = "https://www.baidu.com";
    private TextView tv1;
    private WebView wb1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv1 = findViewById(R.id.web_tv1);
        //wb1 = findViewById(R.id.webview1);
    }

    public void getHttpText(View view) {
//        wb1.loadUrl(HTTP_ADDRESS);
//        wb1.setWebViewClient(new WebViewClient(){
//            @Override
//            public boolean shouldOverrideUrlLoading(WebView view, String url) {
//                view.loadUrl(url);
//                return true;
//            }
//        });
new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(HTTP_ADDRESS);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    connection.connect();
                    int code = connection.getResponseCode();
                    if (code != HttpURLConnection.HTTP_OK) {
                        Log.d("NETWORK",code+"");
                    }// 200;

                    InputStream inputStream = connection.getInputStream();
                    final String rec = HttpInputStreamParse.parseInput(inputStream);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            tv1.setText(rec);
                        }
                    });//这里使用handler也可以与主线程通信
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

}

配置manifest.xml文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.hait.cs.networkdemo">

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.NetworkDemo"
        android:usesCleartextTraffic="true"
        >
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

二. 使用webveiw控件

将上述代码中的webview相关内容解除注释即可得到一个显示的网页,webview的内容显示会将下方源码挤出布局空间。

同时可以使用webview处理添加html和JavaScript文件,这里不再赘述。

三. Json解析

可以在AS中的main文件夹下生成assets文件夹注意不要写错,将Json数据添加至此(在assets文件夹下新建文件后缀xxx.json即可),调用this.getResources().getAssets().open("json路径名")获得一个InputStream对象,转成字符串后可以调用JSONObject对象的optXXX()方法解析Json中的key值从而得到value的值,需要注意数据类型。

json对象:

{
  "name": "张三",
  "age" : 24,
  "married":false
}

json对象数组

[
  {"name": "张三",
    "age" : 24,
    "married":false
  },
  {"name": "阿珍",
    "age" : 25,
    "married":true
  },
  {"name": "阿强",
    "age" : 26,
    "married":true
  }
]

其中json对象中的属性可以是一个json对象,例如添加属性”address“,其可以是一个json对象包含省,市,区等多个属性

除此之外,json对象的属性也可以是一个数组,例如属性"hobby"可以是[ 唱、跳、rap、篮球 ]

可以使用一些软件模拟在线的json请求,例如postman和apipost等。

以下代码演示了如何解析一个json对象,布局文件省略,大致是点击按钮,解析asset文件夹下的一个json对象文件,将解析结果用textview展示出来。

主类.java

public class JsonParseActivity extends AppCompatActivity {

    private TextView tv1;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_json_parse);
        tv1 = findViewById(R.id.json_tv1);
    }

    public void parseJson(View view) {
        try {
            InputStream open = this.getResources().getAssets().open("weather.json");
            String json = HttpInputStreamParse.parseInput(open);

            JSONObject jsonObject = new JSONObject(json);

            String name = jsonObject.optString("name");
            int age = jsonObject.optInt("age");
            String married = jsonObject.optString("married");

            tv1.setText(name+":"+age+":"+married);
        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }


    }
}

解析Json数组:使用JsonArray获取输入流,之后遍历数组即可

parseJsons方法

public void parseJsons(View view) {
       try {
           InputStream open = this.getResources().getAssets().open("persons.json");
           String jsons = HttpInputStreamParse.parseInput(open);
           JSONArray jsonArray = new JSONArray(jsons);
           StringBuilder sb = new StringBuilder();
           for (int i = 0; i< jsonArray.length();i++){
               JSONObject jsonObject = jsonArray.getJSONObject(i);
               String name = jsonObject.optString("name");
               int age = jsonObject.optInt("age");
               String married = jsonObject.optString("married");
               sb.append(name+":"+age+":"+married);
               sb.append("\n");
           }
           tv2.setText(sb.toString());


       } catch (IOException | JSONException e) {
           e.printStackTrace();
       }
   }

四. 使用 Gson解析

使用google开发的第三方库Gson来解析json文件。

添加Gson依赖:选择module,open module settings,dependencies,添加依赖,输入关键字gson*添加对应版本的依赖库。

Gson解析时可以直接将json字符串转换为一个实体类对象,因此可以创建一个pojo包,将待解析的json文件按照对应属性来创建java bean类。

这里可以选择添加插件 gsonformat 或 gsonformat plus,在file选项卡下的settings内选择plugin选项卡搜索对应插件安装即可(mac os选择 Android Studio选项卡下的preference选项,选择plugin并搜索)。

pojo java bean: PersonBean.java

public class PersonBean {

    private String name;
    private int age;
    private boolean married;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }
public void setAge(int age) {
        this.age = age;
    }

    public boolean isMarried() {
        return married;
    }

    public void setMarried(boolean married) {
        this.married = married;
    }
}

使用gson解析json对象:直接给按钮写响应,在布局中构建onClick响应函数parseGson,在主类中创造此方法。

 public void parseGson(View view) {

        try {
            Gson gson = new Gson();
            InputStream open = this.getResources().getAssets().open("weather.json");
            String json = HttpInputStreamParse.parseInput(open);
            PersonBean personBean = gson.fromJson(json, PersonBean.class);
            String name = personBean.getName();
            String age = String.valueOf(personBean.getAge());
            String married = String.valueOf(personBean.isMarried());
            tv1.setText(name+":"+age+":"+married);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

上述做法直接转换为类对象

使用gson解析json数组:直接给按钮写响应,在布局中构建onClick响应函数parseGsons,在主类中创造此方法

public void parseGsons(View view) {
        try {
            InputStream open = this.getResources().getAssets().open("persons.json");
            String json = HttpInputStreamParse.parseInput(open);
            Gson gson = new Gson();
            Type type = new TypeToken<List<PersonBean>>(){}.getType();
            List<PersonBean> personList = gson.fromJson(json, type);
            StringBuilder sb = new StringBuilder();
            for (PersonBean pb:personList){
                String name = pb.getName();
                String age = String.valueOf(pb.getAge());
                String married = String.valueOf(pb.isMarried());
                sb.append(name+":"+age+":"+married);
                sb.append("\n");
            }
            tv2.setText(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

上述代码关键语句在构建type对象,new出TypeToken的实例获取type对象,将json数组转成javabean泛型的集合。最后遍历集合进行操作即可。
附加问题:更加复杂的json文件进行解析,例如json文件:

[
  {
    "name": "zhangsan",
    "age": 18,
    "married": false,
    "zhifubao": {
      "account": "zhangsan",
      "balance": 10000
    },
    "hobby": ["sing","dance","basketball"]
  },
  {
    "name": "lisi",
    "age": 19,
    "married": false,
    "zhifubao": {
      "account": "lisi",
      "balance": 20000
    },
    "hobby": ["idol","rap","walking-dead"]
  }
]

上述文件是一个json数组,数组内两个json对象,其中json对象中属性“zhifubao”又是一个json对象,且属性“hobby”是一个json数组。

解析上述文件时,可参考插件自动构建javabean,外围的json数组一定是一个集合,集合内对象类型为javabean,每一个javabean类中有各种属性,对于复杂属性“zhifubao”,可将其再次构建javabean,内有属性“account”,“balance”。相当于构建支付宝实体类。对于复杂属性“hobby”,其数据类型为一个字符串集合。文章来源地址https://www.toymoban.com/news/detail-408555.html

到了这里,关于Android网络编程,HTTP请求和Json解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android设置app开机自启,网络监听,主线程完成UI渲染,HTTP网络请求工具,json数据处理,android使用sqlite,Android定时任务,日志打印

    在AndroidManifest.xml文件中添加权限 在AndroidManifest.xml文件中注册接收广播配置, 添加到manifest application节点下 在AndroidManifest.xml文件中添加节点属性, 指定安装目录为内部存储器, 而非SD卡 开机启动执行代码 gson是谷歌… implementation ‘gson-2.8.5’ 依赖无法下载, 直接使用jar包, 将ja

    2024年02月03日
    浏览(53)
  • Go语言网络编程(socket编程)http编程

    Web服务器的工作原理可以简单地归纳为 客户机通过TCP/IP协议建立到服务器的TCP连接 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“

    2024年02月09日
    浏览(70)
  • 网络编程 tcp udp http编程流程 网络基础知识

    OSI分层:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 tcp/ip: 应用层 传输层 网络层 数据链路 ip地址:唯一标识一台主机 ipv4 32位 ipv6 128位 寻址 可以反映物理上的一个变化 MAC地址:48 固化在计算机中 ip地址又两部分构成:网络号+主机号 端口号:标识一个应用程序

    2024年02月13日
    浏览(76)
  • 网络编程 http 相关基础概念

    HTTP表单是一种用于在Web应用程序中收集用户输入数据的机制。它由HTML表单元素和HTTP请求组成。 HTML表单元素(如、、等)用于创建用户界面,让用户输入数据。用户可以在表单中填写文本、选择选项、上传文件等。 当用户提交表单时,浏览器会将表单数据封装在HTTP请求中,

    2024年02月11日
    浏览(43)
  • 【Linux网络编程】HTTP协议

    喜欢的点赞,收藏,关注一下把! 目前基本socket写完,一般服务器设计原则和方式(多进程、多线程、线程池)+常见的各种场景,自定义协议+序列化和反序列化都已经学过了。 那有没有人已经针对常见场景,早就已经写好了常见的协议软件,供我们使用呢? 当然了,最典型的

    2024年04月16日
    浏览(56)
  • 【网络编程】协议定制+Json序列化与反序列化

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议,如何保证接收方收到了完整的报文呢?

    2024年02月06日
    浏览(56)
  • C#请求访问HTTP+JSON数据的解析

    最近工作客户需要一个HTTP的Mes需求,所以自己去学习了C#请求HTTP的方法以及JSON数据的解析方法,总结出了点经验,以便后续自己找起来方便一点,故在此写一篇文章。 下面我用一个聚合数据提供的天气预报API接口来阐述请求HTTP和JSON数据解析的功能; 先看API文档这么访问数

    2024年02月12日
    浏览(43)
  • linux【网络编程】之HTTP协议

    在上篇文章中我们模拟了一个应用层协议,HTTP(超文本传输协议)就是其中之一。http就是通过http协议从服务器上读取对应的“资源”,这里所说的资源是在网络上看到的一切都可以看成资源文件;访问资源就是根据路径,从服务器磁盘上拿取资源 平时我们俗称的 “网址” 其

    2024年02月07日
    浏览(48)
  • ℰ悟透Qt—Http网络编程

    网络访问 API 建立在一个 QNetworkAccessManager 对象之上,该对象保存了发送请求所需的公共配置和设置。它包含代理和缓存配置,以及与此类问题相关的信号和可用于监视网络操作进度的回复信号。整个 Qt 应用程序只需要一个 QNetworkAccessManager 实例。由于 QNetworkAccessManager 基于

    2024年02月11日
    浏览(64)
  • Python中的网络编程Socket与HTTP协议的实践【第158篇—网络编程】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在当今互联网时代,网络编程是程序员不可或缺的一项技能。Python作为一种高级编程语言,提供了丰富的网络编程库,使得开发者能够轻松地

    2024年04月09日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包