当前位置:首页 > 行业动态 > 正文

安卓向服务器发送json

安卓端用OkHttp构建JSON,POST请求发送至服务器

准备工作

  1. 添加网络权限
    AndroidManifest.xml 中声明网络权限:

    <uses-permission android:name="android.permission.INTERNET" />
  2. 引入依赖库

    • OkHttp(轻量级网络库):
      implementation 'com.squareup.okhttp3:okhttp:4.10.0'
    • GsonJSON解析库):
      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'

创建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数据 使用 JSONObjectGson 将对象转换为JSON字符串。
设置请求头 Content-Type 必须为 application/json,否则服务器可能拒绝请求。
网络请求方式 POST请求用于提交数据,GET请求通常用于获取数据(不推荐用GET传输JSON)。
异步处理 避免在主线程执行网络请求,否则会抛出 NetworkOnMainThreadException
错误处理 检查响应码(如 response.code())并处理异常(如网络超时、服务器错误)。

常见问题与解答

问题1:如何接收服务器返回的JSON?

解答
在回调中读取 response.body().string(),然后使用 GsonJSONObject 解析。

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

注意:生产环境务必使用合法证书,避免安全

0