Android volley conducting binary body

The script is to load binary data into the message body, process the response body containing JSON.

How do I do the following with Volley?

 curl -X  POST  -H "X-Application-Id: 3KxPB" -H "X-REST-API-Key: jkuI9"  -H "Content-Type: audio/3gp"  --data-binary '@test.3gp' https://host/1/files/audio

      

IMO - there is a gap in the handling of volleyball binary POST types that apache httpclient handles in abstracthttpentity subclasses . If buffered binary data generated on a phone using a camera, microphone, or other binary output sensors needs a mechanism to be wrapped and written to the body of the POST, how to do it in a volley?

I looked at PoolingByteArrayOutputStream and would like to do something like fill the buffer and get PBAOutStrm by writing PBAOutStrm from the buffer and then drag the OutStrm into the InputStream and then wrap it in the body of the POST request like something like ByteArrayEntity. I cannot figure out how to do this in a volley.

+1


source to share


2 answers


I was able to solve this problem with a salvo GsonRequest:



public class MainActivity extends AppCompatActivity {


    String url = "https://arcane-anchorage-34204.herokuapp.com/handleCode";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        JSONObject jsonBody = null;
        try {
            jsonBody = new JSONObject ("{\"code\":\"NZ4UBUB\"}");
        } catch (JSONException e) {
            Toast.makeText(getApplicationContext(), "Error e = " + e, Toast.LENGTH_SHORT).show();
        }

        Map<String, String> headers = new HashMap<String, String>();
        headers.put("Content-Type", "application/json");

        RequestQueue queue = Volley.newRequestQueue(this);

        GsonRequest<Routine[]> gsonRequest = new GsonRequest<Routine[]>(Request.Method.POST, url, Routine[].class, headers, new Response.Listener<Routine[]>() {
            @Override
            public void onResponse(Routine[] routineData) {
                TextView serverData = (TextView)findViewById(R.id.serverData);

                String complete = "";
                String repeat = "";
                String hold = "";
                String perform = "";
                String txtData = "";

                for (int i = 0; i < routineData.length; i++) {
                    complete = (routineData[i].instructions.complete != null) ? "Complete: " + routineData[i].instructions.complete : "";
                    repeat = (routineData[i].instructions.repeat != null) ? "Repeat: " + routineData[i].instructions.repeat : "";
                    hold = (routineData[i].instructions.hold != null) ? "Hold: " + routineData[i].instructions.hold : "";
                    perform = (routineData[i].instructions.perform != null) ? "Perform: " + routineData[i].instructions.perform : "";

                    txtData += "DESCRIPTION: " + routineData[i].description[0] + ": " + routineData[i].description[1] + ", " + complete  + ", " + repeat  + ", " + hold  + ", " + perform + " ";
                }
                serverData.setText("Response: " + txtData);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                TextView serverData = (TextView)findViewById(R.id.serverData);

                serverData.setText("Response: " + volleyError.toString());

            }
        }, jsonBody);
        queue.add(gsonRequest);
    }
    public class GsonRequest<T> extends Request<T> {
        private final Gson gson = new Gson();
        private final Class<T> clazz;
        private final Map<String, String> headers;
        private final Response.Listener<T> listener;
        private JSONObject parameters = null;

        /**
         * Make a GET request and return a parsed object from JSON.
         *
         * @param url URL of the request to make
         * @param clazz Relevant class object, for Gson reflection
         * @param headers Map of request headers
         */
        public GsonRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
                           Response.Listener<T> listener, Response.ErrorListener errorListener) {
            super(method, url, errorListener);
            this.clazz = clazz;
            this.headers = headers;
            this.listener = listener;
        }

        public GsonRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
                           Response.Listener<T> listener, Response.ErrorListener errorListener, JSONObject parameters) {
            this(method, url, clazz, headers, listener, errorListener);
            this.parameters = parameters;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return headers != null ? headers : super.getHeaders();
        }

        @Override
        public String getBodyContentType() {
            return "application/json";
        }

        @Override
        public byte[] getBody() throws AuthFailureError {
            try {
                return parameters.toString().getBytes(getParamsEncoding());
            } catch (UnsupportedEncodingException e) {
            }
            return null;
        }

        @Override
        protected void deliverResponse(T response) {
            listener.onResponse(response);
        }

        @Override
        protected Response<T> parseNetworkResponse(NetworkResponse response) {
            try {
                String json = new String(
                        response.data, HttpHeaderParser.parseCharset(response.headers));
                Log.i("RESPONSE", json);
                return Response.success(
                        gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JsonSyntaxException e) {
                return Response.error(new ParseError(e));
            }
        }
      }
    }

      

0


source


To send binary data, you can do something like what I did in this answer How to send a POST in "multipart / form-data" format in Android using Volley .



-1


source







All Articles