Solicitud de red de programación de red de Android

Solicitud de red de programación de red de Android

Directorio de artículos

Este artículo presenta las solicitudes de red de Android y desarrolla una demostración simple, adecuada para que la aprendan los principiantes de Android.

¿Por qué escribir esto? ? Para recién graduados. . .

1. Contenido principal

1. Preparación básica antes de desarrollar solicitudes de red
2. Código de solicitud de red común
3. Utilice el marco de red OkHttp para solicitar el código de red
4. Utilice el marco de red Retrofit para solicitar el código de red
5. Utilice WebView para mostrar la página web de la URL correspondiente
6. Aplicación código relacionado con la demostración y apk

2. Preparación básica antes de desarrollar solicitudes de red.

1. Compruebe si la URL solicitada es válida.

(1) Verificación en línea a través de la página web

Puede verificar solicitudes de obtención y solicitudes de publicación simples, como solicitudes de publicación que solo establecen algunos parámetros
Pruebas de solicitud de obtención/publicación en línea (también hay una serie de herramientas):
http://www.jsons.cn/httpurl/
http: //coolaf.com/

//Puedes simplemente simular los datos devueltos por get/post
https://v7.apipost.cn/#/apis/design

(2) Utilice la herramienta de solicitud de red de ventanas dedicada

① PostMan
② Apifox (versión nacional mejorada y de desarrollo propio de PostMan, compatible con herramientas web y de escritorio)
https://apifox.com/#pricing

(3) Escribir verificación del código de la aplicación

Generalmente se usa para verificar la carga de archivos.
También puede usar herramientas de Windows para la verificación. Apifox también admite la carga de archivos.

2. Aprenda a convertir datos json del servidor en objetos Bean

Conversión en línea del formato Json a la clase Bean de entidad JAVA:
http://www.jsons.cn/json2java/

¿efecto?
Asigne los datos de la cadena al objeto y utilice directamente Object.getXXX para obtener la información devuelta.

También puedes utilizar el complemento de Android Studio: GsonFormat

3. Pruebas de efectos específicos

Para obtener pruebas de solicitud, puede encontrar la URL del clima en línea o la URL de API de broma; para
pruebas posteriores a la solicitud, puede encontrar la API de mapas (Baidu Map) o la URL de API de voz (iFlytek).

URL de prueba sencilla:

API meteorológica:

Proporcionar clima y consulta meteorológica: https://www.yiketianqi.com/index/doc
obtener URL de solicitud;
https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000

URL de depuración de apipost

Proporciona una función de depuración simple de get/post: https://v7.apipost.cn/#/apis/design
Después de registrarse e iniciar sesión, parece que los datos devueltos se pueden diseñar, se estima que la operación es un poco más problemático. Puedes estudiarlo tú mismo si es necesario.

URL de solicitud de publicación:
https://demo-api.apipost.cn/api/demo/login
mobile=18289454846&ver_code=123456

(1) Obtener solicitud, mostrar solicitud en la barra de la ventana del navegador

Insertar descripción de la imagen aquí

(2) Visualización de la solicitud de obtención en la URL de solicitud en línea

Insertar descripción de la imagen aquí

(3) La solicitud de publicación se muestra en la URL de la solicitud en línea.

Las solicitudes de publicación no pueden solicitar datos directamente en la línea de entrada del navegador. Solo puede utilizar URL o herramientas profesionales para obtener datos de solicitud de publicación.

Insertar descripción de la imagen aquí

(4) Convierta datos json en objetos Bean en línea

Insertar descripción de la imagen aquí

Visualización del efecto de la aplicación;

Interfaz principal:
Insertar descripción de la imagen aquí

Solicitud de red ordinaria:

Insertar descripción de la imagen aquí

Solicitud de red OkHttp:
Insertar descripción de la imagen aquí

Solicitud de actualización de red: ¿
Insertar descripción de la imagen aquí
Por qué TextView se muestra incorrectamente? Puede consultarlo en el código.

Interfaz WebView:
Insertar descripción de la imagen aquí

Hay muchas interfaces WebView que se muestran en la demostración de la aplicación, aquí solo se muestra una de ellas.

Dirección de descarga de recursos de código:

https://download.csdn.net/download/wenzhi20102321/88215651

3. Introducción al código

1. Solicitudes de red ordinarias

Las solicitudes de red deben ejecutarse en subprocesos secundarios; de lo contrario, se informará un error.
Una vez devueltos los datos, es necesario volver a cambiarlos al hilo principal para que se muestren en la interfaz.

(1) obtener solicitud de red

    //get方法请求网络
    public void getNetwork(View view) {
        GET_UTL = et_url_get.getText().toString();
        LogUtil.debugInform("GET_UTL = " + GET_UTL);
        //创建线程,请求网络
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 创建一个URL对象
                URL url = null;
                try {
                    url = new URL(GET_UTL);

                    // 创建一个HttpURLConnection对象,并设置请求方法为GET
                    HttpURLConnection connection = null;
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(5000);
                    // 获取服务器响应的状态码
                    int responseCode = 0;
                    responseCode = connection.getResponseCode();
                    if (responseCode == HttpURLConnection.HTTP_OK) {
                        // 读取服务器响应的数据
                        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        StringBuilder response = new StringBuilder();
                        String line;
                        while ((line = reader.readLine()) != null) {
                            response.append(line); //把读取的数据不断放入response对象中
                        }
                        reader.close();
                        // 在UI线程中更新UI  runOnUiThread
                         String responseData = response.toString();
                

                    }


                } catch (Exception e) {
                    e.printStackTrace();
                    LogUtil.error("", e);
                }


            }
        }).start();

    }

(2) Solicitud de red posterior


  //post方法请求王网络
    public void postNetwork(View view) {
       
        //创建线程,请求网络
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 创建一个URL对象
                URL url = null;
                try {
                    url = new URL(POST_UTL);

                    // 创建一个HttpURLConnection对象,并设置请求方法为GET
                    HttpURLConnection connection = null;
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setConnectTimeout(5000);

                    //------------------------------ 区别和Get方法 ,Start
                    connection.setRequestMethod("POST");

                    // 启用输出流,以便向服务器发送数据
                    connection.setDoOutput(true);

                    // 创建一个输出流对象,并将数据写入输出流
                    OutputStream outputStream = connection.getOutputStream();
                    String postData = POST_MESSAGE;
                    outputStream.write(postData.getBytes());
                    outputStream.flush();
                    outputStream.close();
                    //------------------------------ 区别和Get方法 ,End

                    // 获取服务器响应的状态码
                    int responseCode = connection.getResponseCode();
                    if (responseCode == HttpURLConnection.HTTP_OK) {
                        // 读取服务器响应的数据
                        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        StringBuilder response = new StringBuilder();
                        String line;
                        while ((line = reader.readLine()) != null) {
                            response.append(line); //把读取的数据不断放入response对象中
                        }
                        reader.close();
                        // 在UI线程中更新UI
                         // 处理服务器响应的数据
                        String responseData = response.toString();

                    }


                } catch (Exception e) {
                    e.printStackTrace();
                    LogUtil.error("", e);
                }


            }
        }).start();
    }

2. Utilice el marco de red OkHttp para solicitar la red.

(1) Obtener solicitud de red


    //get方法请求网络
    public void getNetwork(View view) {
    
        Request request = new Request.Builder()
                .url(GET_UTL)
                .get() //默认为get ,不设置也行
                .build();
        Call call = client.newCall(request);
        //网络请求的回调
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                Toast.makeText(OkhttpNetworkActivity.this, "请求错误:" + e.getMessage(), Toast.LENGTH_LONG).show();
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                // 处理服务器响应的数据
                String responseData = response.body().string();
                LogUtil.debugInform("responseData = " + responseData);
                // TODO: 在这里处理服务器响应的数据

            }
        });


    }

(2) Solicitud de red posterior


    //post方法请求王网络
    public void postNetwork(View view) {
        //创建网络处理的对象
        OkHttpClient client = new OkHttpClient.Builder()
                .readTimeout(5, TimeUnit.SECONDS)
                .build();

        //mobile=18289454846&ver_code=123456
        //post请求来获得数据
        //创建一个RequestBody,存放重要数据的键值对
        RequestBody body = new FormBody.Builder()
                .add("mobile", "18289454846")
                .add("ver_code", "123456").build();
        //创建一个请求对象,传入URL地址和相关数据的键值对的对象
        Request request = new Request.Builder()
                .url(POST_UTL)
                .post(body).build();

        //创建一个能处理请求数据的操作类
        Call call = client.newCall(request);

        //使用异步任务的模式请求数据
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                LogUtil.error("", e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                // 在UI线程中更新UI
                 String responseData = response.body().string();
                 LogUtil.debugInform("result = " + responseData);

            }
        });

    }


3. Utilice el marco de red Retrofit para solicitar la red.

(1) Obtener solicitud de red

Solicitar URL de muestra:
https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000

①Crear objeto de interfaz de solicitud
package com.example.networkdemo.retrofit;


import com.example.networkdemo.bean.WeatherBean;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Get请求
 * 这里使用get请求的方式请求数据
 * 并且到的是字符串数据
 */
public interface RetrofitWeatherService {
    //键值对的定义和数据的返回类型的定义这里是String
    //https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000
    //这里使用 @Field 是会报错,是要使用 @Query
    @GET("api")//get请求方式
    Call<WeatherBean> getWeather(@Query("unescape") String unescape, @Query("version") String version,
                                 @Query("appid") String appid, @Query("appsecret") String appsecret, @Query("adcode") String adcode);
}


② Código de solicitud específico

Por ejemplo, escriba el siguiente código en una Actividad


    //get方法请求网络
    public void getNetwork(View view) {

        Retrofit retrofit = getGsonRetrofit(GET_UTL);

        RetrofitWeatherService weatherService = retrofit.create(RetrofitWeatherService.class);
        //?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000"
        Call<WeatherBean> call = weatherService.getWeather("1", "v61", "28392918", "No9zfo8f", "440307000000");
        //转换成Call,在call对象包含Url的完整地址
        //可以看到这里使用了create的方法,里面传入了请求服务的接口类
        //并且后面接的是接口类的方法,方法里面传入Url地址要的键值对的值
        //这时call对象就有完整的Url地址,就可以请求数据了
        //使用call对象进行网络数据请求
        call.enqueue(new Callback<WeatherBean>() {
            //网络数据请求成功的回调方法
            @Override
            public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        WeatherBean bean = response.body();
                        tv_info.setText(TimeUtil.getTimeString() + " \n Get请求的数据:" + bean + "");
                        String air_tips = bean.getAir_tips();
                        String update_time = bean.getUpdate_time();
                        String tem1 = bean.getTem1();
                        String tem2 = bean.getTem2();
                        String tem = bean.getTem();
                        Toast.makeText(RetrofitNetworkActivity.this, "天气时间:" + update_time
                                + "\n 当前温度:" + tem + ",温度变化" + tem2 + "--" + tem1 +
                                "\n 温馨提示:" + air_tips, Toast.LENGTH_LONG).show();
                    }
                });
            }

            //网络数据请求失败的回调方法
            @Override
            public void onFailure(Call<WeatherBean> call, Throwable t) {
                tv_info.setText(TimeUtil.getTimeString() + " \n Get 请求的失败日志:" + t.getMessage() + "");
            }
        });

    }

(2) Solicitud de red posterior

URL de solicitud de publicación: https://demo-api.apipost.cn/api/demo/login
que contiene información: mobile=18289454846&ver_code=123456

①Crear objeto de interfaz de solicitud
package com.example.networkdemo.retrofit;



import com.example.networkdemo.bean.LoginBean;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

/**
 * 登陆服务器的请求
 * 这里使用post请求的方式请求数据
 * 并且到的是一个自定义的对象数据
 */
public interface RetrofitLoginService {
    //https://demo-api.apipost.cn/api/demo/login
    @POST("api/demo/login")//Post请求方式
    @FormUrlEncoded      //键值对的定义和数据的返回类型的定义这里是String
    Call<LoginBean> login(@Field("mobile") String mobile, @Field("ver_code") String ver_code);
}

② Código de solicitud específico

    //post方法请求王网络
    public void postNetwork(View view) {
      
        Retrofit retrofit = getGsonRetrofit(POST_UTL); //https://demo-api.apipost.cn/
        RetrofitLoginService loginService = retrofit.create(RetrofitLoginService.class);
        Call<LoginBean> call = loginService.login("18289454846", "123456");
        call.enqueue(new Callback<LoginBean>() {
            @Override
            public void onResponse(Call<LoginBean> call, Response<LoginBean> response) {
                // 在UI线程中更新UI
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // 处理服务器响应的数据
                        LoginBean loginBean = response.body();
                        LogUtil.debugInform("loginBean = " + loginBean);
                        int code = loginBean.getCode();
                        LoginBean.DataBean data = loginBean.getData();
                        String msg = loginBean.getMsg();
                        Toast.makeText(RetrofitNetworkActivity.this, "登陆信息:" +
                                "\n code = " + code + ", msg = " + msg, Toast.LENGTH_LONG).show();
                        LogUtil.debugInform("data getToken = " + data.getToken());

                        // TODO: 在这里处理服务器响应的数据
                        tv_info.setText(TimeUtil.getTimeString() + " \n Post请求的数据:" + response + "");
                    }
                });
            }

            @Override
            public void onFailure(Call<LoginBean> call, Throwable t) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        tv_info.setText(TimeUtil.getTimeString() + " \n Post请求的失败日志:" + t.getMessage() + "");
                    }
                });
            }
        });
    }


    //返回一个Gson类型的对象
    public Retrofit getGsonRetrofit(String url) {
        Retrofit retrofit = new Retrofit.Builder().baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        return retrofit;
    }


    //返回一个Gson类型的字符串,
    public Retrofit getStringRetrofit(String url) {
        Retrofit retrofit = new Retrofit.Builder().baseUrl(url)
                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
        return retrofit;
    }


4. Utilice WebView para mostrar la página web correspondiente a la URL

(1) Escriba el control WebView en el archivo de diseño.

   <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

(2) Establecer parámetros básicos


         web_view = findViewById(R.id.web_view);
  
        WebSettings webSettings = web_view.getSettings();
        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

        //要显示的网址:
        web_view.loadUrl(url); //设置网址

Este es solo el código básico, también puede configurar el monitoreo de saltos, saltos de páginas web hacia adelante y hacia atrás, etc., y puede depurarlo y estudiarlo usted mismo.

3. Resumen

1. Las solicitudes de red deben realizarse dentro de subprocesos.

2. Se utilizan solicitudes de red de diferentes marcos de acuerdo con las condiciones específicas del proyecto.

Si las solicitudes de red se utilizan con frecuencia, puede utilizar solicitudes nativas directamente sin utilizar un marco de red.
Si la frecuencia de uso es alta, puede utilizar un marco de red sólido: OkHttp/Retrofit;
OkHttp es fácil de usar, mientras que Retrofit es más complejo de usar, pero se puede usar junto con muchos otros marcos, como Gson, RxJava, etc.

3. ¿Qué deberías aprender sobre la programación de redes de Android?

(1) Conocimientos básicos de capas de red y protocolo HTTP, como mensajes de solicitud y mensajes de respuesta.

Aunque no necesariamente lo utilices, aún necesitas conocer los puntos de conocimiento que contiene.

(2) Conceptos básicos de programación de redes Java, TCP/UDP para interacción de conexión

Puede escribir demostraciones, una como cliente y otra como servidor, y comunicarse e interactuar después de la conexión.

(3) Convertir datos Json a objetos Gson

Las solicitudes de datos en Internet básicamente devuelven datos json, y el uso de objetos Gson se puede convertir directamente en los objetos correspondientes, lo cual es más conveniente de usar.

Sin embargo, también hay datos devueltos por algunas solicitudes de red que no están en formato de datos json, como el formato xml u otros formatos específicos.
Esto requiere que escriba su propia clase de herramienta para el análisis.

(4) Solicitudes de red básicas de Android y uso del marco de red básico

Solicitar la red sin utilizar un marco de red y solicitar la red con un marco de red convencional.

(5) Algoritmo de cifrado: cifrado y descifrado de datos

Debido a que los datos de la red están cifrados, se deben descifrar antes de poder leer los datos normales.
El algoritmo solo necesita poder usar el marco, ¡la mayoría de las personas no pueden escribir el algoritmo específico!

Supongo que te gusta

Origin blog.csdn.net/wenzhi20102321/article/details/132282049
Recomendado
Clasificación