• 【Android开发】Android请求出现网络请求失败,HTTP请求,安全网络通信与权限管理


    额外权限

    要有这个权限:

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

    HTTP安全考虑

    从 Android 9(API 级别 28)开始,默认情况下不支持通过 HTTP 访问网络,而要求使用 HTTPS。这是出于安全考虑,因为 HTTPS 可以提供数据传输的加密和身份验证。因此,如果你的应用目标设备的 Android 版本为 9 或更高,确实需要使用 HTTPS 进行网络请求。

    为了解决这个问题,你有几个选项:

    1. 使用 HTTPS:将你的服务器配置为支持 HTTPS,并相应地更新 Android 代码中的基础 URL,将 http 修改为 https

    2. 在 AndroidManifest.xml 中添加网络安全配置:如果你的服务器尚未配置 HTTPS,你可以在 AndroidManifest.xml 中添加网络安全配置,允许应用访问不安全的 HTTP 资源。这样做会降低安全性,因此不建议在生产环境中使用。配置如下:

    <application
        android:usesCleartextTraffic="true"
        ... >
        ...
    application>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 使用网络安全配置文件:如果你的应用只是需要连接到特定的不受信任的 HTTP 服务,你可以创建一个网络安全配置文件,定义允许的网络请求。示例:
    <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">your.insecure.domaindomain>
        domain-config>
    network-security-config>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后在 AndroidManifest.xml 中引用这个文件:

    <application
        android:networkSecurityConfig="@xml/network_security_config"
        ... >
        ...
    application>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用 HTTPS 是推荐的做法,因为它提供了更好的安全性。

    在这里插入图片描述

    这样就可以访问接口

    gradle加上:

    
        implementation 'com.squareup.retrofit2:retrofit:2.9.0'
        implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    
    
    • 1
    • 2
    • 3
    • 4

    实现请求:

    
        private static final String BASE_URL = "http://120.46.128.4:8001/";
    
        interface ApiService {
            @POST("check_in")
            Call<ResponseBody> checkIn(@Body RequestBody body);
        }
    
    
        private void checkIn(String name, String studentID) throws JSONException {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
            ApiService apiService = retrofit.create(ApiService.class);
    
            JSONObject json = new JSONObject();
            json.put("name", name);
            json.put("student_id", studentID);
    
            RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json.toString());
            Call<ResponseBody> call = apiService.checkIn(body);
    
            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    if (response.isSuccessful()) {
                        try {
                            JSONObject jsonResponse = new JSONObject(response.body().string());
                            String message = jsonResponse.getString("message");
                            runOnUiThread(() -> Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show());
                        } catch (Exception e) {
                            e.printStackTrace();
                            runOnUiThread(() -> Toast.makeText(MainActivity.this, "响应解析失败", Toast.LENGTH_SHORT).show());
                        }
                    } else {
                        runOnUiThread(() -> Toast.makeText(MainActivity.this, "签到失败", Toast.LENGTH_SHORT).show());
                    }
                }
    
                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {
                    runOnUiThread(() -> Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show());
                }
            });
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    python是这么请求:

    import requests
    
    # 接口地址
    url = "http://120.46.128.4:8001/insert_student_record"  # 根据实际的地址进行修改
    
    # 要插入的学生记录
    data = {
        "name": "张三",
        "student_id": "123456xx"
    }
    
    # 发送 POST 请求
    response = requests.post(url, json=data)
    
    # 输出响应结果
    print(response.json())
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    问询、帮助

    你如果需要帮助,请看这里:

    https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
    
    • 1
  • 相关阅读:
    vue3 快速入门系列 —— 状态管理 pinia
    【Java成王之路】EE初阶第二十四篇: Servlet
    9月8日作业
    svn co 大型项目
    【js基础】Promise专题
    【2023届秋招】网易算法岗
    VirtualBox设置共享文件夹步骤及遇到的问题
    抽象工厂 责任链模式,观察者模式
    pyqt QPlainTextEdit 中捕获回车
    Java错题归纳day15
  • 原文地址:https://blog.csdn.net/x1131230123/article/details/139039531