Microsoft Computer Vision API with android volley 响应代码 400

Microsoft Computer Vision API with android volley response code 400

在使用 Android Volley 请求时,我在从 Microsoft 自定义视觉 API(光学字符识别 API)获取 JSON 响应时遇到一些问题。

我已经将这种方法与其他 API 一起使用,没有任何问题,但是对于这个 API 我无法让它工作。

    String URL = "https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/ocr";
    final ProgressDialog pDialog = new ProgressDialog(this);
    pDialog.setMessage("Getting License plate...");
    pDialog.setCancelable(false);
    pDialog.show();
    try {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        JSONObject jsonBody = new JSONObject();
        jsonBody.put("url", "https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Atomist_quote_from_Democritus.png/338px-Atomist_quote_from_Democritus.png");

        final String requestBody = jsonBody.toString();

        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                pDialog.hide();
                Log.i("VOLLEY", response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("VOLLEY", error.toString());
            }
        }) {
            @Override
            public byte[] getBody() throws AuthFailureError {
                try {
                    return requestBody == null ? null : requestBody.getBytes("utf-8");
                } catch (UnsupportedEncodingException uee) {
                    VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8");
                    return null;
                }
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<>();
                headers.put("Content-Type", "application/json");
                headers.put("Ocp-Apim-Subscription-Key", "123124123123123123213");
                return headers;
            }
        };
        requestQueue.add(stringRequest);
    } catch (JSONException e) {
        e.printStackTrace();
    }

我收到了回复:

E/Volley: [2163] BasicNetwork.performRequest: Unexpected response code 400 for https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/ocr

使用邮递员时,我没有收到任何错误。

所以希望你能看到我做错了什么。 如果你想让我详细说明什么,请告诉我。

谢谢!

您必须将 StringRequest 替换为 JsonObjectRequest 并删除 Content-type header。

这对我有用:

        final JSONObject jsonBody = new JSONObject();
        jsonBody.put("url", "https://pbs.twimg.com/profile_images/808958766628605952/yB14UlXl_400x400.jpg");

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, URL, jsonBody,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        System.out.println(response.toString());
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        String readableError = "";
                        try {
                            readableError = new String(error.networkResponse.data, "utf-8");
                            System.out.println(readableError);
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                    }
                }) {
                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        HashMap<String, String> headers = new HashMap<>();
                        headers.put("Ocp-Apim-Subscription-Key", "XXXXXXXX");
                        return headers;
                    }
                };

请注意,我们在旧设备上遇到了奇怪的问题。

是上传的图片太大造成的。 Api 只是 returns 400 没有任何解释。

ImageHelper class 有调整图像大小的代码