Залп-запрос POST с необработанными данными изображения - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь использовать залп для вызова API-интерфейса REST Azure Computer Vision с использованием запроса POST для загрузки изображения, подлежащего анализу.

Вот документация по API: https://southeastasia.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/56f91f2e778daf14a499e1fa

Входные данные передаются в теле POST, и я хотел отправить двоичное необработанное изображение, используя application/octet-stream.

Я конвертирую изображение в двоичный файл, используя bitmap.compress(...) и byteArrayOutputStream.toByteArray();

У меня пока нет успеха в отправке необработанных двоичных данных изображения, это дает ошибку 400.

Вот код:

public void testVollReq(){

   final TextView tv = findViewById(R.id.tv);
   String url = "https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/describe";
   final StringBuilder stringBuilder = new StringBuilder();

   JSONObject postParams = new JSONObject();
   try {
       postParams.put("maxCandidates","1");
   } catch (JSONException e) {
       e.printStackTrace();
   }

   JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
        Request.Method.POST,
        url,
        null,
        new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONObject descriptionObject = response.getJSONObject("description");
                    JSONArray captionsArr = descriptionObject.getJSONArray("captions");
                    for (int i = 0; i < captionsArr.length(); i++) {
                        JSONObject captionObject = captionsArr.getJSONObject(i);
                        stringBuilder.append((String) captionObject.get("text")).append("\n");
                        Toast toast = Toast.makeText(MainActivity.this, "SUCCESS", Toast.LENGTH_SHORT);
                        toast.show();
                        tv.setText(stringBuilder.toString());
                    }
                } catch (JSONException e) {
                    Toast toast = Toast.makeText(MainActivity.this, "FAIL1", Toast.LENGTH_SHORT);
                    toast.show();
                    e.printStackTrace();
                }
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast toast = Toast.makeText(MainActivity.this, "FAIL2", Toast.LENGTH_SHORT);
                toast.show();
                tv.setText(error.getMessage());
            }
        })
   {
       @Override
       public Map<String, String> getHeaders() throws AuthFailureError {
           HashMap headers = new HashMap();
           headers.put("Content-Type", "application/octet-stream");
           headers.put("Ocp-Apim-Subscription-Key", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
           return headers;
       }

       @Override
       public byte[] getBody() {
           Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
           ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
           bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
           byte[] imageData = byteArrayOutputStream.toByteArray();
           return imageData;
       }
   };

   RequestQueue requestQueue = Volley.newRequestQueue(this);
   requestQueue.add(jsonObjectRequest);
}

В интернете только несколько ресурсов о запросе Volley POST с использованием application/octet-stream, поэтому я немного растерялся ...

Буду признателен за любую помощь!

...