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

