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

使用Android Volley调用Microsoft自定义视觉OCR API时遇400错误,无法获取JSON响应

排查Volley调用微软自定义视觉OCR API返回400错误的思路

我来帮你拆解下这个Volley调用微软自定义视觉OCR API返回400的问题——这类错误本质是请求不符合API的要求,而你用Postman能正常调用,说明问题大概率出在Volley的请求构造细节上,咱们一步步排查:

1. 先确认认证头是否完全正确

微软的视觉API对认证要求很严格,你得确保Volley请求里的订阅密钥头和Postman里的完全一致:

  • 核心头字段是 Ocp-Apim-Subscription-Key,别拼错字段名,也别漏加这个头
  • 同时要注意Content-Type的设置:如果是直接传图片二进制,要设为 application/octet-stream;如果传Base64编码的JSON,要设为 application/json
  • 给你个简单的示例代码参考:
// 假设是上传二进制图片的场景
ByteArrayRequest request = new ByteArrayRequest(Request.Method.POST, YOUR_API_URL,
        response -> {
            // 处理成功响应
            String jsonResponse = new String(response);
            // 解析JSON逻辑
        },
        error -> {
            // 处理错误
            Log.e("VolleyError", error.toString());
        }) {
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<>();
        headers.put("Ocp-Apim-Subscription-Key", "你的订阅密钥");
        headers.put("Content-Type", "application/octet-stream");
        return headers;
    }
};
// 添加到请求队列
Volley.newRequestQueue(context).add(request);

2. 检查请求体的编码和格式

Postman能正常跑,很大概率是Volley的请求体和Postman的不匹配:

  • 如果是上传图片:别用默认的StringRequest!它会把二进制图片转成字符串,直接破坏编码,要用ByteArrayRequest或者自定义的MultipartRequest来发送原始二进制流
  • 如果是传Base64的JSON:要确保请求体是符合API要求的JSON结构(比如{"image": "你的Base64字符串"}),而且StringRequest要正确设置请求体内容,示例:
StringRequest request = new StringRequest(Request.Method.POST, YOUR_API_URL,
        response -> { /* 解析响应 */ },
        error -> { /* 处理错误 */ }) {
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<>();
        headers.put("Ocp-Apim-Subscription-Key", "你的订阅密钥");
        headers.put("Content-Type", "application/json");
        return headers;
    }

    @Override
    public String getBodyContentType() {
        return "application/json; charset=utf-8";
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        // 构造符合要求的JSON请求体
        JSONObject jsonBody = new JSONObject();
        try {
            jsonBody.put("image", "Base64编码的图片字符串");
            return jsonBody.toString().getBytes("utf-8");
        } catch (JSONException | UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
};

3. 核对请求方法和API端点

别小看这个细节:

  • 确认你用的是POST方法(微软OCR API需要POST,GET是不行的)
  • 核对API的完整URL,包括区域前缀(比如eastus.api.cognitive.microsoft.com)和路径后缀(比如/vision/v3.2/ocr),要和Postman里的完全一致,不能少字符或者多空格

4. 检查是否遗漏了可选参数

如果Postman里你加了额外参数(比如指定识别语言?language=zh、检测方向detectOrientation=true),Volley请求里也要对应带上,要么拼在URL后面,要么按照API要求放在请求头里

5. 抓包对比请求差异

如果上面几点都排查完还是不行,建议抓包对比Volley和Postman的请求:

  • 用Android Studio的Network Inspector,或者Charles抓Volley的请求包
  • 对比两者的请求头、请求体、URL参数,找到不一样的地方——毕竟Postman能正常工作,差异点就是问题所在

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:12:08