Я пытаюсь использовать залп для вызова 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
, поэтому я немного растерялся ...
Буду признателен за любую помощь!