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

安卓开发发送请求数据

安卓开发中发送请求数据的方法与实践

使用原生 HttpURLConnection 发送请求

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

    <uses-permission android:name="android.permission.INTERNET" />
  2. GET 请求示例

    String url = "https://api.example.com/data";
    new Thread(() -> {
        try {
            URL requestUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            // 读取响应
            InputStream inputStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            connection.disconnect();
            // 回到主线程处理结果
            runOnUiThread(() -> {
                Log.d("Response", response.toString());
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }).start();
  3. POST 请求示例

    String url = "https://api.example.com/upload";
    String jsonData = "{"key":"value"}";
    new Thread(() -> {
        try {
            URL requestUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/json");
            // 写入请求体
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(jsonData.getBytes());
            outputStream.flush();
            outputStream.close();
            // 读取响应
            InputStream inputStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            connection.disconnect();
            // 回到主线程处理结果
            runOnUiThread(() -> {
                Log.d("Response", response.toString());
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }).start();

使用第三方库 OkHttp 发送请求

  1. 添加依赖
    build.gradle 中添加:

    安卓开发发送请求数据  第1张

    implementation 'com.squareup.okhttp3:okhttp:4.10.0'
  2. GET 请求示例

    OkHttpClient client = new OkHttpClient();
    Request request = new Request.Builder()
        .url("https://api.example.com/data")
        .build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                final String responseBody = response.body().string();
                runOnUiThread(() -> Log.d("Response", responseBody));
            }
        }
    });
  3. POST 请求示例

    OkHttpClient client = new OkHttpClient();
    RequestBody body = RequestBody.create(
        "{"key":"value"}", MediaType.parse("application/json"));
    Request request = new Request.Builder()
        .url("https://api.example.com/upload")
        .post(body)
        .build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (response.isSuccessful()) {
                final String responseBody = response.body().string();
                runOnUiThread(() -> Log.d("Response", responseBody));
            }
        }
    });

使用 Retrofit 发送请求

  1. 添加依赖
    build.gradle 中添加:

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
  2. 定义接口

    public interface ApiService {
        @GET("data")
        Call<ResponseBody> getData();
        @POST("upload")
        Call<ResponseBody> uploadData(@Body Map<String, String> data);
    }
  3. 创建 Retrofit 实例并调用

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.example.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
    ApiService apiService = retrofit.create(ApiService.class);
    // GET 请求
    Call<ResponseBody> call = apiService.getData();
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                try {
                    Log.d("Response", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            t.printStackTrace();
        }
    });
    // POST 请求
    Map<String, String> data = new HashMap<>();
    data.put("key", "value");
    apiService.uploadData(data).enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                try {
                    Log.d("Response", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            t.printStackTrace();
        }
    });

注意事项

  1. 网络权限
    必须声明 <uses-permission android:name="android.permission.INTERNET" />
  2. 主线程限制
    网络请求需在子线程执行,UI 更新需切回主线程。
  3. SSL 证书验证
    • OkHttp 可配置忽略 SSL 验证(仅限测试环境):
      OkHttpClient client = new OkHttpClient.Builder()
          .sslSocketFactory(new TrustAllCertificates().sslSocketFactory(), new TrustAllCertificates().trustManager)
          .build();
    • Retrofit 可通过 OkHttpClient 配置。
  4. 错误处理
    需处理网络异常、超时、服务器错误等。

方法对比表

方法 优点 缺点
HttpURLConnection 原生支持,无需额外依赖;灵活性高 代码量大,API 繁琐;需手动处理线程和异常
OkHttp 轻量级,支持缓存、拦截器;代码简洁 需手动管理线程;复杂功能需自定义
Retrofit 基于 OkHttp,支持动态代理、注解;适合复杂 API 交互 学习成本较高;依赖较多
Volley 适合小规模数据请求,内置缓存和队列管理 不支持 HTTP/2;不适合大文件上传下载

相关问题与解答

问题 1:如何选择适合的网络请求库?

  • HttpURLConnection:适合简单场景或学习网络原理。
  • OkHttp:适合需要高效、灵活控制的网络请求(如自定义拦截器)。
  • Retrofit:适合复杂的 RESTful API 交互,尤其是结合 RxJava 或协程时。
  • Volley:适合小数据量、短生命周期的请求(如 ListView 图片加载)。

问题 2:如何处理 HTTPS 证书验证?

  • OkHttp:通过 SSLSocketFactoryTrustManager 自定义验证逻辑,或临时忽略验证(仅限测试)。
  • Retrofit:通过 OkHttpClient 配置 SSL 验证。
  • 通用方案:将证书添加到应用信任库,或使用第三方库(如 TrustKit)管理证书
0