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

Android使用okhttp3调用OpenAI Whisper API持续返回400错误求助

调用OpenAI Whisper API返回400错误排查求助

在Android中调用OpenAI Whisper API时,请求持续返回400错误。Postman中请求可正常运行,因此排除密钥或请求头问题,推测是okhttp3的使用存在错误。以下是尝试过的两段代码及返回结果,寻求排查建议:

第一段代码

public void requestWhisper(String file, Callback callback) {

        OkHttpClient client = new OkHttpClient();
        MediaType mediaType = MediaType.parse("audio/mpeg"); 
        File audioFile = new File(file);

        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("model", "whisper-1")
                .addFormDataPart("file", audioFile.getName(), 
                                  RequestBody.create(audioFile, mediaType))
                .build();

        Request request = new Request.Builder()
                .url(whisper_api)
                .post(requestBody)
                .addHeader("Authorization", "Bearer " + key)
                .addHeader("Content-Type", "multipart/form-data")
                .build();


        client.newCall(request).enqueue(new okhttp3.Callback() {
            @Override
            public void onResponse(@NonNull Call call, @NonNull okhttp3.Response response) throws IOException {
                if (response.isSuccessful()) {
                    String result = response.body().string();
                    callback.onCallback(result);
                } else {
                    callback.onCallback("Error: " + response.message());
                }
            }
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
                callback.onCallback("Error: " + e.getMessage());
            }
        });
}

返回结果:

Response{protocol=h2, code=400, message=, url=https://api.openai.com/v1/audio/transcriptions}

第二段代码

OkHttpClient client = new OkHttpClient().newBuilder().build();
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
  .addFormDataPart("model","whisper-1")
  .addFormDataPart("file","VOICE_FILE.mp3",
    RequestBody.create(MediaType.parse("application/octet-stream"),
    new File("FILE_PATH")))
  .build();
Request request = new Request.Builder()
  .url("https://api.openai.com/v1/audio/transcriptions")
  .method("POST", body)
  .addHeader("Authorization", "Bearer " + key)
  .addHeader("Content-Type", "multipart/form-data")
  .build();
Response response = client.newCall(request).execute();

返回结果仍为400错误。


排查建议

  • 移除手动设置的Content-Type头:OkHttp在构建Multipart请求时会自动生成包含boundary的multipart/form-data头,手动设置会覆盖掉这个带boundary的头,导致服务端无法正确解析请求体。
  • 检查音频文件的有效性:确保传入的文件路径正确,文件存在且可读。Android中需要申请对应的文件读取权限(如READ_EXTERNAL_STORAGE或使用MediaStore获取文件),避免因权限问题导致文件无法读取。
  • 打印完整错误响应:400错误通常会返回详细的错误描述,在onResponse的错误分支中,不要只获取response.message(),要调用response.body().string()打印完整响应内容,这能直接定位问题原因。
  • 抓包对比请求:用Charles或OkHttp的拦截器抓取Android端的请求,和Postman的请求做对比,重点看请求头(尤其是Content-Type的boundary)、请求体中的参数、文件名称和Content-Disposition字段是否一致。
  • 更新OkHttp版本:如果使用的是旧版本OkHttp,可能存在multipart请求的兼容性问题,建议升级到最新稳定版。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:08:16