Search code examples
androidapiandroid-volleyazure-cognitive-serviceshttp-status-code-400

Microsoft Computer Vision API with android volley response code 400


I'm having some trouble getting JSON response from Microsoft custom vision API (Optical Character Recognition API) when using Android Volley request.

I have used this approach with other API's without any problems, but for this API I cant get it to work.

    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();
    }

I'm getting this response back:

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

When using postman I'm not getting any errors.

enter image description here

enter image description here

So hope you can see what I'm doing wrong. Let me know if you want me to elaborate on anything.

Thanks!


Solution

  • You have to replace StringRequest with JsonObjectRequest and get rid of the Content-type header.

    This works for me:

            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;
                        }
                    };