You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何向GET请求发送Body数据?JSON请求体发送失败求助

在Android中给GET请求发送Body数据的解决办法

嘿,我明白你现在的困扰——想给GET接口传JSON请求体但代码没生效对吧?先给你理清楚核心问题,再给你可行的实现方案:

先搞懂一个关键点:GET请求带Body的规范问题

首先得说,HTTP标准其实并没有完全禁止GET请求带请求体,但绝大多数HTTP客户端、服务器和代理都会默认忽略GET的Body(因为GET的语义是「获取资源」,通常参数都是放URL里的)。所以第一步你要确认:你的后端接口确实明确支持接收GET请求的Body,不然就算客户端写对了,后端也收不到。

如果后端已经确认支持,那咱们来看Android端的具体实现:

方案1:用HttpURLConnection实现(原生API)

你之前的代码可能用了默认的HttpURLConnection,但它默认会把GET请求的Body忽略掉,需要手动强制设置请求方法和输出流:

public static void getQuestionsListApi2(final String requestId, final String timestamp, 
                                       final ImageProcessingCallback.downloadQuestionsCallbacks callback, 
                                       final Context context) {
    new Thread(() -> {
        HttpURLConnection conn = null;
        try {
            URL url = new URL(NetUrls.downloadQuestions);
            conn = (HttpURLConnection) url.openConnection();
            
            // 关键:设置请求方法为GET,同时允许输出(因为要写Body)
            conn.setRequestMethod("GET");
            conn.setDoOutput(true); // 这一步很重要,默认GET是false
            conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
            
            // 写入JSON Body
            JSONObject jsonBody = new JSONObject();
            jsonBody.put("requestId", requestId);
            jsonBody.put("timestamp", timestamp);
            String mRequestBody = jsonBody.toString();
            
            OutputStream os = conn.getOutputStream();
            os.write(mRequestBody.getBytes(StandardCharsets.UTF_8));
            os.flush();
            os.close();
            
            // 处理响应
            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
                br.close();
                // 回调成功
                new Handler(Looper.getMainLooper()).post(() -> callback.onSuccess(sb.toString()));
            } else {
                // 回调失败
                new Handler(Looper.getMainLooper()).post(() -> callback.onFailure("请求失败,状态码:" + responseCode));
            }
        } catch (Exception e) {
            e.printStackTrace();
            new Handler(Looper.getMainLooper()).post(() -> callback.onFailure(e.getMessage()));
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
        }
    }).start();
}

方案2:用OkHttp实现(更推荐,更简洁)

OkHttp是Android开发中常用的网络库,它对GET请求带Body的支持更友好,不需要绕太多弯:

首先确保你已经添加了OkHttp的依赖(在build.gradle里):

implementation 'com.squareup.okhttp3:okhttp:4.12.0'

然后实现请求:

public static void getQuestionsListApi2(final String requestId, final String timestamp, 
                                       final ImageProcessingCallback.downloadQuestionsCallbacks callback, 
                                       final Context context) {
    OkHttpClient client = new OkHttpClient();
    
    // 构建请求体
    JSONObject jsonBody = new JSONObject();
    try {
        jsonBody.put("requestId", requestId);
        jsonBody.put("timestamp", timestamp);
    } catch (JSONException e) {
        e.printStackTrace();
        new Handler(Looper.getMainLooper()).post(() -> callback.onFailure("JSON构建失败"));
        return;
    }
    
    RequestBody body = RequestBody.create(
        jsonBody.toString(),
        MediaType.parse("application/json; charset=utf-8")
    );
    
    // 关键:构建GET请求并设置Body
    Request request = new Request.Builder()
        .url(NetUrls.downloadQuestions)
        .method("GET", body) // OkHttp这里直接支持给GET方法传Body
        .build();
    
    // 发起异步请求
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {
            new Handler(Looper.getMainLooper()).post(() -> callback.onFailure(e.getMessage()));
        }

        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            if (response.isSuccessful()) {
                String responseBody = response.body().string();
                new Handler(Looper.getMainLooper()).post(() -> callback.onSuccess(responseBody));
            } else {
                new Handler(Looper.getMainLooper()).post(() -> callback.onFailure("请求失败,状态码:" + response.code()));
            }
        }
    });
}

最后要注意的坑

  • 再次确认后端:一定要和后端开发确认,他们的接口确实能接收GET请求的Body,否则一切都是白搭。
  • 代理问题:有些网络代理(比如公司内网代理)会过滤掉GET请求的Body,导致请求失败,这种情况可能需要换POST方法(如果后端允许的话)。
  • 线程问题:网络请求不能在主线程执行,上面的例子里都用了异步线程/OkHttp的异步回调,记得不要在主线程做网络操作。

内容的提问来源于stack exchange,提问作者Kumar Jadhav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:12:39