额外权限
要有这个权限:
<uses-permission android:name="android.permission.INTERNET" />
HTTP安全考虑
从 Android 9(API 级别 28)开始,默认情况下不支持通过 HTTP 访问网络,而要求使用 HTTPS。这是出于安全考虑,因为 HTTPS 可以提供数据传输的加密和身份验证。因此,如果你的应用目标设备的 Android 版本为 9 或更高,确实需要使用 HTTPS 进行网络请求。
为了解决这个问题,你有几个选项:
-
使用 HTTPS:将你的服务器配置为支持 HTTPS,并相应地更新 Android 代码中的基础 URL,将
http
修改为https
。 -
在 AndroidManifest.xml 中添加网络安全配置:如果你的服务器尚未配置 HTTPS,你可以在 AndroidManifest.xml 中添加网络安全配置,允许应用访问不安全的 HTTP 资源。这样做会降低安全性,因此不建议在生产环境中使用。配置如下:
<application
android:usesCleartextTraffic="true"
... >
...
</application>
- 使用网络安全配置文件:如果你的应用只是需要连接到特定的不受信任的 HTTP 服务,你可以创建一个网络安全配置文件,定义允许的网络请求。示例:
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">your.insecure.domain</domain>
</domain-config>
</network-security-config>
然后在 AndroidManifest.xml 中引用这个文件:
<application
android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
使用 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<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());
}
});
}
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())