Microsoft Computer Vision API с кодом ответа на залп Android 400

У меня возникают проблемы с получением ответа JSON от Microsoft Custom Vision API (API оптического распознавания символов) при использовании запроса Android Volley.

Я использовал этот подход с другими 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

При использовании почтальона ошибок не возникает.

введите здесь описание изображения

введите здесь описание изображения

Надеюсь, вы понимаете, что я делаю не так. Дайте мне знать, если вы хотите, чтобы я уточнить что-нибудь.

Спасибо!


person J_K_J    schedule 04.03.2018    source источник
comment
Что произойдет, если вы используете JsonObjectRequest вместо StringRequest?   -  person cthrash    schedule 05.03.2018


Ответы (2)


Вы должны заменить StringRequest на JsonObjectRequest и избавиться от заголовка Content-type.

Это работает для меня:

        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;
                    }
                };
person Maria Ines Parnisari    schedule 05.03.2018

Обратите внимание, что у нас были странные проблемы на старых устройствах.

Причина в том, что загруженное изображение слишком велико. Api просто возвращает 400 без объяснения причин.

В классе ImageHelper есть код для изменения размера изображения

person brian.clear    schedule 18.03.2018