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

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

码农世界 2024-05-19 前端 55 次浏览 0个评论

额外权限

要有这个权限:


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 资源。这样做会降低安全性,因此不建议在生产环境中使用。配置如下:


    ...

  1. 使用网络安全配置文件:如果你的应用只是需要连接到特定的不受信任的 HTTP 服务,你可以创建一个网络安全配置文件,定义允许的网络请求。示例:

    
        your.insecure.domain
    

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


    ...

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

这样就可以访问接口

gradle加上:

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

实现请求:

    private static final String BASE_URL = "http://120.46.128.4:8001/";
    interface ApiService {
        @POST("check_in")
        Call 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 call = apiService.checkIn(body);
        call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response 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 call, Throwable t) {
                runOnUiThread(() -> Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show());
            }
        });
    }

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())

转载请注明来自码农世界,本文标题:《【Android开发】Android请求出现网络请求失败,HTTP请求,安全网络通信与权限管理》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,55人围观)参与讨论

还没有评论,来说两句吧...

Top