上一篇
安卓向服务器发送json
- 行业动态
- 2025-04-24
- 4004
安卓端用OkHttp构建JSON,POST请求发送至服务器
准备工作
添加网络权限
在AndroidManifest.xml
中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
引入依赖库
- OkHttp(轻量级网络库):
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
- Gson(JSON解析库):
implementation 'com.google.code.gson:gson:2.10.1'
- Retrofit(高级网络封装库,可选):
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
- OkHttp(轻量级网络库):
创建JSON数据
使用 JSONObject
手动构建
JSONObject json = new JSONObject(); try { json.put("username", "testUser"); json.put("age", 25); json.put("isMember", true); } catch (JSONException e) { e.printStackTrace(); }
使用 Gson
自动转换对象
class User { String username; int age; boolean isMember; } Gson gson = new Gson(); String json = gson.toJson(new User("testUser", 25, true));
发送JSON请求
方法1:使用 OkHttp
// 1. 创建OkHttpClient实例 OkHttpClient client = new OkHttpClient(); // 2. 构建RequestBody MediaType JSON = MediaType.get("application/json; charset=utf-8"); RequestBody body = RequestBody.create(json, JSON); // 3. 构建Request对象 Request request = new Request.Builder() .url("https://example.com/api/user") // 替换为实际URL .post(body) .build(); // 4. 异步发送请求 client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 处理失败(如网络错误) Log.e("OkHttp", "Request failed", e); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { // 处理成功响应 String responseBody = response.body().string(); Log.d("OkHttp", "Response: " + responseBody); } else { // 处理服务器错误(如404) Log.e("OkHttp", "Server Error: " + response.code()); } } });
方法2:使用 Retrofit
// 1. 定义API接口 public interface ApiService { @POST("/api/user") Call<UserResponse> createUser(@Body User user); // UserResponse需定义对应字段 } // 2. 创建Retrofit实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com/") // 替换为实际URL .addConverterFactory(GsonConverterFactory.create()) .build(); // 3. 发送请求 ApiService apiService = retrofit.create(ApiService.class); User user = new User("testUser", 25, true); Call<UserResponse> call = apiService.createUser(user); // 4. 异步处理 call.enqueue(new Callback<UserResponse>() { @Override public void onResponse(Call<UserResponse> call, Response<UserResponse> response) { if (response.isSuccessful()) { UserResponse result = response.body(); Log.d("Retrofit", "Response: " + result); } else { Log.e("Retrofit", "Server Error: " + response.code()); } } @Override public void onFailure(Call<UserResponse> call, Throwable t) { Log.e("Retrofit", "Request failed", t); } });
关键步骤说明
步骤 | 说明 |
---|---|
构建JSON数据 | 使用 JSONObject 或 Gson 将对象转换为JSON字符串。 |
设置请求头 | Content-Type 必须为 application/json ,否则服务器可能拒绝请求。 |
网络请求方式 | POST请求用于提交数据,GET请求通常用于获取数据(不推荐用GET传输JSON)。 |
异步处理 | 避免在主线程执行网络请求,否则会抛出 NetworkOnMainThreadException 。 |
错误处理 | 检查响应码(如 response.code() )并处理异常(如网络超时、服务器错误)。 |
常见问题与解答
问题1:如何接收服务器返回的JSON?
解答:
在回调中读取 response.body().string()
,然后使用 Gson
或 JSONObject
解析。
String responseBody = response.body().string(); UserResponse user = gson.fromJson(responseBody, UserResponse.class);
问题2:如何处理HTTPS证书验证失败?
解答:
若服务器使用自签名证书,需在OkHttp中忽略证书验证(仅用于开发环境):
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(new SSLContext().init(null, trustAllCerts, new SecureRandom()).getSocketFactory(), trustAllCerts) .hostnameVerifier((hostname, session) -> true) // 忽略主机名验证 .build();
注意:生产环境务必使用合法证书,避免安全