android volley post json ID and get result back from PHP server

↘锁芯ラ 提交于 2020-01-15 04:52:29

问题


i am struggling to make this work, basically i get an id from previous activity using intent, now i want to send this id to server so it returns all the data associated with this id.

javacode

final String URL = "URL";
// Post params to be sent to the server
HashMap<String, String> params = new HashMap<String, String>();
params.put("ID", "1");

JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params),
       new Response.Listener<JSONObject>() {
           @Override
           public void onResponse(JSONObject response) {
               try {
                   VolleyLog.v("Response:%n %s", response.toString(4));
                    print response in textview;
               } catch (JSONException e) {
                   e.printStackTrace();
               }
           }
       }, new Response.ErrorListener() {
           @Override
           public void onErrorResponse(VolleyError error) {
               VolleyLog.e("Error: ", error.getMessage());
           }
       });

// add the request object to the queue to be executed
ApplicationController.getInstance().addToRequestQueue(req);

PHP server

if (!empty($_POST)) {

    $query = " SELECT * FROM table WHERE ID = :ID " ;

    $query_params = array(
        ':ID' => $_POST['ID'],);

    try {
        $statement   = $db->prepare($query);
        $result = $statement->execute($query_params);
    }
    catch (PDOException $ex) {


        $response["success"] = 0;
        $response["message"] = "Database query error";
        die(json_encode($response));

    }

    $result = $statement->fetchAll();

    if($result){

            $data =array();

            foreach($result as $rows){
        $json = array();
        $json["Name"] = $rows["Name"];





        array_push ($data,$json);



            }
     echo stripcslashes(json_encode($data, JSON_PRETTY_PRINT));

回答1:


i used this example of http://www.itsalif.info/content/android-volley-tutorial-http-get-post-put and coverted the string response to string array, worked for me

url = "http://httpbin.org/post";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() 
        {
            @Override
            public void onResponse(String response) {
                // response
                Log.d("Response", response);
            }
        }, 
        new Response.ErrorListener() 
        {
             @Override
             public void onErrorResponse(VolleyError error) {
                 // error
                 Log.d("Error.Response", response);
           }
        }
    ) {     
        @Override
        protected Map<String, String> getParams() 
        {  
                Map<String, String>  params = new HashMap<String, String>();  
                params.put("name", "Alif");  
                params.put("domain", "http://itsalif.info");

                return params;  
        }
    };
    queue.add(postRequest);



回答2:


I would modify the request like this:

JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,URL,null,
                        new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject response) {
                                try {
                                   VolleyLog.v("Response:%n %s", response.toString(4));
                                   print response in textview;
                                } catch (JSONException e) {
                                   e.printStackTrace();
                                }

                            }
                        },
                        new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {

                            }
                        })

                @Override 
                protected Map<String, String> getParams() {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("ID", "1");
                    return params;
                }
          };    

          ApplicationController.getInstance().addToRequestQueue(req);

and also would modify the PHP code like this:

if (isset($_POST['ID'])) {
     $id = $_POST['ID'];
    try {
        $statement = $db->prepare(SELECT * FROM table WHERE ID = ?);
        $statement->bindValue(1, $id);
        $result = $statement->execute();
    }
    catch (PDOException $ex) {
        $response["success"] = 0;
        $response["message"] = "Database query error";
        die(json_encode($response));
    }
    $records = array();
    $records = $statement->fetchAll(PDO::FETCH_ASSOC);
    $data = array();
    foreach($records as $record){
        $data["Name"] = $record["Name"];
    }
     echo stripcslashes(json_encode($data, JSON_PRETTY_PRINT));
}

Hope it helps!!!




回答3:


the issue is that you send json but you expect params in you php.

there 2 solutions:

1) update php to accept json not just post params

2) update volley request to send post params but expect JSONObject

for example you can use this request:

    public class JsonObjReq extends Request<JSONObject> {


    private final Response.Listener<JSONObject> mListener;
    private final Map<String, String> params;

    public JsonObjReq(int method, String url, Map<String, String> params, Response
                      .Listener<JSONObject> mListener,
                      Response.ErrorListener listener) {
        super(method, url, listener);
        this.mListener = mListener;
        this.params = params;
    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return params;
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, "utf-8"));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

    @Override
    protected void deliverResponse(JSONObject response) {
        mListener.onResponse(response);
    }
}

and apply to your code like that:

    final String URL = "URL";
// Post params to be sent to the server
HashMap<String, String> params = new HashMap<String, String>();
params.put("ID", "1");

JsonObjReq req = new JsonObjReq(Method.POST, URL, params,
       new Response.Listener<JSONObject>() {
           @Override
           public void onResponse(JSONObject response) {
               try {
                   VolleyLog.v("Response:%n %s", response.toString(4));
                    print response in textview;
               } catch (JSONException e) {
                   e.printStackTrace();
               }
           }
       }, new Response.ErrorListener() {
           @Override
           public void onErrorResponse(VolleyError error) {
               VolleyLog.e("Error: ", error.getMessage());
           }
       });

// add the request object to the queue to be executed
ApplicationController.getInstance().addToRequestQueue(req);


来源:https://stackoverflow.com/questions/36505614/android-volley-post-json-id-and-get-result-back-from-php-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!