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
相关产品推荐
相关产品推荐

