• 【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
  • 相关阅读:
    【自撰写】【国际象棋入门】第7课 常见战术分析(二)牵制、驱赶和腾挪
    解决node项目一个极度困难的捕获异常却无法读取异常信息的问题
    web前端页面基础
    c语言练习题83:#include“ “和#include<>的区别
    Web架构安全分析/http/URL/Cookie攻击
    linux学习 day05 基础 I/O
    【自动驾驶】针对低速无人车的线控底盘技术
    「PAT甲级真题解析」Advanced Level 1004 Counting Leaves
    月薪2w+的测试,到底强在哪里?
    常用的一些vscode前端插件
  • 原文地址:https://blog.csdn.net/x1131230123/article/details/139039531