安卓端网络数据请求原理和技术(1):安卓端和服务端json数据格式传输——get请求和post请求

安卓端网络数据请求原理和技术(1):json数据格式——get请求和post请求(应用篇)

小编寄语

你好! 欢迎来到博主空间,博主于2019年开始从事软件行业,希望在这个领域有所成就。将自身的技术积累和成长历程分享给大家,欢迎大家批评指正!让我们尽情徜徉于技术的海洋,勇于创新,大胆实践,享受不一样的快乐,创造精彩的人生!

本篇摘要

本篇侧重于实际操作与应用,而非技术原理的剖析!

安卓网络数据请求这一模块对于很多初学者来说都很神秘,今天小编带你们揭开安卓端使用OkHttp网络请求框架进行网络数据获取过程的神秘面纱。

本篇从最基础的内容讲起,侧重于应用,而非底层原理。首先,我们要搞清楚get请求和post请求两个概念。

简单地说,get请求是用来获取服务端数据,在url后面拼接参数。我们使用浏览器访问一个网站的指定位置的时候,通常在url后面加上我们的参数,来获取我们想要的页面数据信息(本篇不深入研究url格式),这就是我们通常所说的get请求,安卓端的get请求就是把指定的网址封装到我们的代码里,我们通常通过点击按钮调用OkHttp框架来对这个网址发起网络数据请求。

post请求在网络请求的时候可以将一些数据信息提交给服务器来处理,这些数据放在Request body中,服务器将数据处理后,按照我们给定的一些信息,返回安卓端所需要的数据,显然post数据请求比get数据请求更加安全,个人认为,这就是get请求和post请求的最大的区别。本篇的数据请求均采用json格式,即安卓端和服务端数据传输格式均为json。

开发工具+操作+代码解析

实践是检验真理的唯一标准,这一模块小编将通过代码一步一步解析实现简单的get请求和post请求。小编将代码解析写在代码注释中,以方便读者阅读。

开发工具

小编使用工具为android studio 3.4.2,jdk1.8。

项目搭建

为了使用OkHttp框架进行网络数据请求,我们需要导入依赖包:

implementation ‘com.squareup.okhttp3:okhttp:4.0.1’

首先我们要打开android studio,新建一个空的project,打开项目app的build.gradle文件,将依赖添加到这个文件中,如图所示(重点关注箭头指向的部分,其他依赖包部分为3.4.2新版本变动之后需要导入的依赖包,详细信息可自行百度了解,此项目中不必关注。):
导入OkHttp框架的依赖包

布局

接下来我们要在activity_main.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"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btn_get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="get请求"
        />
    <Button
        android:id="@+id/btn_post"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post请求"
        />
    <TextView
        android:id="@+id/tv_net"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/grey"
        />
</LinearLayout>

在这个布局中,我们建立了两个Button和一个TextView,Button按钮用于发起网络请求(一个发起get请求,一个发起post请求),TextView用于显示服务端传过来的数据。页面效果如下所示:
页面布局
注意: 服务端接口为小编自己写的接口,为方便理解,本篇不过多阐述服务端的技术。小编在实践之前已经将服务端的接口写好,并在服务端设置了网络请求后的返回数据内容。

上图中的android-springcloud2为小编的安卓项目名称。

接下来开始编码阶段(以下代码均位于MainActivity.java文件中,此类在AndroidManifest.xml文件中被设置为启动类):

get 和 post网络请求代码的编写

package com.example.android_springcloud2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONObject;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    private Button btnGet;
    private Button btnPost;
    private TextView tvNet;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnGet=(Button)findViewById(R.id.btn_get);
        btnPost=(Button)findViewById(R.id.btn_post);
        tvNet=(TextView)findViewById(R.id.tv_net);
		//get请求点击事件
        btnGet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                get();
            }
        });
		//post请求点击事件
        btnPost.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                post();
            }
        });
    }
	//get请求
    public void get(){
    	//第一步,创建request
        Request request = new Request.Builder()
                .url("---此处写入服务端接口地址,即get请求接口地址---")
                .get()//此处为get请求
                .build();
        //第二步,实例化网络请求类OkHttpClient,发起网络请求,传入request。OkHttp帮我们实现了异步数据请求,使我们可以将数据请求代码写在主线程里。
        new OkHttpClient().newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            	//如果请求失败,则程序走入这个方法
                System.out.println("onFailure:" + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
            	//如果请求成功,则程序走入这个方法
				System.out.println("onSuccess:" + response.body().string());//此处打印出后台传输过来的json数据
                String responseBody = response.body().string();
                //此方法处理数据
                setUi_get(responseBody);
            }
        });
    }
    
    public void post(){
    	//第一步,使用HashMap进行数据封装
        String a="post2_a";
        String b="post2_b";
        String c="post2_c";
        String d="post2_d";
        String e="post2_e";
        Map<String, Object> bodyMap = new HashMap<>();
        bodyMap.put("post2_a", a);
        bodyMap.put("post2_b", b);
        bodyMap.put("post2_c", c);
        bodyMap.put("post2_d", d);
        bodyMap.put("post2_e", e);
		//第二步,将封装好的数据转换为json格式
        String jsonParams = new JSONObject(bodyMap).toString();
        //第三步,创建requestbody,post请求需要提交一个表单application/json代表数据是个json
        RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8")
                , jsonParams);
		//第四步,封装数据和url
        Request.Builder requestBuilder = new Request.Builder();
        requestBuilder.url("---此处写入服务端接口地址,即post请求接口地址---")
                .post(body);
		//第五步网络数据请求,OkHttp帮我们实现了异步数据请求,使我们可以将数据请求代码写在主线程里。
        new OkHttpClient().newCall(requestBuilder.build()).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
                //同get请求
                System.out.println("onFailure:" + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) {
            	//同get请求
                try {
                    final String responseMessage = response.message();
                    //获取返回的Json字符串
                    final String responseBody = response.body().string();//Json字符串,用于后续解析
                    System.out.println("response :\n" + responseBody + "\nresponseMessage :\n" + responseMessage);
                   //数据处理
                    setUi_post(responseBody);
                } catch (IOException e) {
                	//打印异常信息
                    System.out.println("response :\n" + "IOException");
                } catch (com.google.gson.JsonParseException e) {
                	//打印异常信息
                    System.out.println("response :\n" + "com.google.gson.JsonParseException");
                }
            }
        });
    }

    public void setUi_get(String response){
		//此处格外注意,更新UI要在主线程里操作。此处为异步线程
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvNet.setText(response);
            }
        });
    }

    public void setUi_post(String response){
		//此处格外注意,更新UI要在主线程里操作。此处为异步线程
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tvNet.setText(response);
            }
        });
    }
}

另外,我们在AndroidManifest.xml文件中要添加网络权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android_springcloud2">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name111"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>

以上代码小编亲测有效,小编将解析写在代码里是为了让读者更好的理解每一句代码的作用。在进行服务端网络请求的时候,我们需要把我们的手机和服务端放在同一个网络环境下。通常我们在开发的过程中,网络的稳定性关系到前后端的接口调试,所以我们需要保证内网环境良好。此外在调试接口过程中会遇到很多问题,所以如果遇到网络问题,请耐心调试即可。

将应用部署到安卓手机上,进行网络请求(网络请求地址为小编定义的接口地址,当然,我们也可将url写为任何有效的网址(get请求),这样,通过get请求,我们可以得到网页的元素信息),如下图所示:

此图显示为get请求数据结果,服务端get请求数据接口返回信息如图所示:
get请求
此图为post请求数据结果,post接口将安卓端传送的数据进行了封装,再一次将数据以json格式返回了安卓端(服务端返回数据过程在此项目中不必关注,小编在今后的技术文章中会逐步更新服务端的技术,此项目中读者能接收到服务端返回的报文就成功了),如下图所示,可见,我们进行了一次成功的post网络请求。
post请求
下面我们将代码中get请求的url地址换成任何一个网址,小编换成了"https://www.hao123.com/",这样我们通过get请求可以获取到这个网页的元素信息,如下图所示:
在这里插入图片描述

学习总结

经过这个案例的学习,想必大家都能明白安卓端网络数据请求与接收的过程了吧?在实际开发中,我们并不会直接以这样的方式写代码,此案例只为讲明白安卓端网络请求框架OkHttp的使用过程,真正的项目开发中,安卓端开发人员会将这些基础的网络请求代码封装为一个网络请求类,在这个网络请求类中逐渐增加更多自己的内容,以满足项目开发需要,同时增强项目代码的可读性。我们可以搜索到很多高手写的OkHttp网络请求类的案例,归根到底都是基于以上代码。读者也可基于这个最基础的代码进行封装,构建自己的一套网络请求框架,提高自己的开发效率。对于初学者来说,应该把实践摆在第一位,当我们学会熟练使用这些网络框架的时候,才能更好地理解它的原理。

后续小编会逐步丰富内容,共享开发经验和技术,尽自己微薄之力助力初学者的技术学习,欢迎大家批评指正!关注我,共同交流进步!

发布了1 篇原创文章 · 获赞 1 · 访问量 93

猜你喜欢

转载自blog.csdn.net/wenlu_2018/article/details/103902235