简体   繁体   中英

How can I post data with Volly and receive JSON object

I want to post an int to an https address and pass 3 JSON objects to text views and I can't get JSON results. I've tried to use methods in onResponse but it's not working. How can I POST an integer and parse some JSON objects to text views? I'm a beginner in Android developing and I don't know how to resolve this problem. What's the problem? please help

    if(isNetworkAvailable()){
        RequestQueue queue = Volley.newRequestQueue(this);
        String url = "https://example.com/api";
        StringRequest postRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<JSONObject>()
                {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {

                            Log.d("Response", response);
                        } catch (JSONException e) {
                            e.printStackTrace();
                            alertUserAboutError();
                        }
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // error
                        mStoreName.setText("Error");
                    }
                }
        ) {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String>  params = new HashMap<String, String>();
                params.put("category_id", "28");

                return params;
            }
        };

        queue.add(postRequest);

    }
        Toast.makeText(this, "Network is unavailable!", Toast.LENGTH_LONG).show(); }
private void updateDisplay() {
    mStoreName.setText(mStoreDetails.getStoreName());
    mInstagram.setText(mStoreDetails.getInstagram());
    mTelegram.setText(mStoreDetails.getTelegram());

}

private StoreDetails getStoreDetails(String jsonData) throws JSONException {
    JSONObject JSONRequest = new JSONObject(jsonData);

    StoreDetails storeDetails = new StoreDetails();
    storeDetails.setStoreName(JSONRequest.getString("store_name"));
    storeDetails.setInstagram(JSONRequest.getString("instagram"));
    storeDetails.setTelegram(JSONRequest.getString("telegram"));

    return storeDetails;
}

private boolean isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    boolean isAvailable = false;
    if (networkInfo != null && networkInfo.isConnected()) {
        isAvailable = true;
    }
    return isAvailable;
}

private void alertUserAboutError() {
    AlertDialogFragment dialog = new AlertDialogFragment();
    dialog.show(getFragmentManager(), "error_dialog");
}

This works for me. Use an stringrequest to put the post data to the request. After onResponse was called I create an JSON-Object from the string:

public void doServerRequest(final Context context, final String url, final Map<String,String> postParameters, final HashMap<String,String> getParameters, final OnFinishTaskListener<String, JSONObject> listener){
    Log.d(TAG,"Start new server request (" + url + ")");
    StringRequest request = new StringRequest(Request.Method.POST, addParametersToUrl(url, getParameters), new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, response);
            try {
                JSONObject json = new JSONObject(response);
                if (json.getInt(CODE_TAG) == 0){
                    listener.getResult(SUCCESS_TAG, json);
                } else {
                    listener.getResult(ERROR_TAG, null);
                }
            } catch (Exception e){
                e.printStackTrace();
                listener.getResult(ERROR_TAG, null);
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            listener.getResult(ERROR_TAG, null);
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            if(postParameters == null){
                return new HashMap<String, String>();
            }
            return postParameters;
        }
    };
    requestQueue.add(request);
}

This adds the get-Paramters to the URL (if exist):

private String addParametersToUrl(String url, HashMap<String,String> getParameters){
    if(getParameters == null || getParameters.size() == 0){
        return url;
    }
    Log.d(TAG,"Preparing URL: "+url);
    StringBuilder stringBuilder = new StringBuilder(url);
    stringBuilder.append("?");
    int i = 0;
    for (String key : getParameters.keySet()) {
        if(i>0) stringBuilder.append("&");
        stringBuilder.append(key).append("=").append(getParameters.get(key));
        i++;
    }
    url = stringBuilder.toString();
    Log.d(TAG,"Prepared URL: "+url);
    return url;
}

I use this listener interface:

public interface OnFinishTaskListener<S,J> {
    public void getResult(S string, J json);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM