0
When I make a POST Request according to my function postRequest() using the StringRequest of Volley I cannot access the parameters passed on getParams(). However, the method getRequest() works as expected. I’m running the app on my phone, talking to the server on my notebook, both connected on the same wifi.
My Mainactivity is:
package com.example.simplerequest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button get_request = (Button) findViewById(R.id.getRequest);
textView = (TextView) findViewById(R.id.textView);
get_request.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
postRequest(); // ou getRequest();
}
});
}
private void getRequest () {
RequestQueue requestQueue = Volley.newRequestQueue(this);
String url="http://192.168.5.199:5000/get_all";
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText("Data: " + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("Get Data: Response Failed!"+error);
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String,String>();
params.put("Content-Type", "application/json; charset=UTF-8");
params.put("x-api-key", "mySuperSecretKey");
return params;
}
};
requestQueue.add(stringRequest);
}
private void postRequest() {
String url="http://192.168.5.199:5000/add_new";
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText("Post Data: " + response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("Post Data: Response Failed!\n"+error);
}
}){
@Override
protected Map<String, String> getParams() {
Map<String,String> params = new HashMap<String,String>();
params.put("id", "3");
params.put("name", "value3");
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> header = new HashMap<String,String>();
header.put("Content-Type", "application/json; charset=UTF-8");
header.put("x-api-key", "mySuperSecretKey");
return header;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.getCache().clear();
requestQueue.add(stringRequest);
}
}
And, when triggering the function postRequest(), my app returns Post Data: {"error":"Bad request"}. The request is sent successfully and does not fall into the onErrorResponse.
However, I cannot access the meter on the side of my server, which answers me:
Params: {}
192.168.5.94 - - [03/Nov/2020 04:21:56] "POST /add_new HTTP/1.1" 200 -
My server, made with flask, is:
from flask import Flask, request, jsonify
app = Flask(__name__)
db = [
{
'id':1,
'name':'value1',
},
{
'id':2,
'name':'value2',
}
]
@app.route('/get_all', methods=['GET'])
def get_all():
if request.headers.get('x-api-key') != 'mySuperSecretKey':
return jsonify({'error': 'Permission denied'}), 403
return jsonify(db), 200
@app.route('/add_new', methods=['POST'])
def add_new():
if request.headers.get('x-api-key') != 'mySuperSecretKey':
return jsonify({'error': 'Permission denied'}), 403
print("\nParams: {}".format(request.args.to_dict()))
if ("id" in request.args.keys()) and ("name" in request.args.keys()):
db.append({
'id': int(request.args.get('id')),
'name': request.args.get('name')
})
return jsonify(db), 200
return jsonify({'error': 'Bad request'}), 200 #O postRequest() recebe este return
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
And when I test the routes with the following Python script:
import requests
url = "http://127.0.0.1:5000/"
url = "http://192.168.5.199:5000/"
headers = {
'content-type' : 'application/json',
'x-api-key':'mySuperSecretKey'
}
r = requests.get(url+'get_all', headers=headers)
print(r.json())
input_data = {
'id':"3",
'name':'value3',
}
r = requests.post(url+'add_new', headers=headers, params=input_data)
print(r.json())
I see that the output of the script is the expected:
[{'id': 1, 'name': 'value1'}, {'id': 2, 'name': 'value2'}]
[{'id': 1, 'name': 'value1'}, {'id': 2, 'name': 'value2'}, {'id': 3, 'name': 'value3'}]
And the server terminal output too:
192.168.5.199 - - [03/Nov/2020 04:17:05] "GET /get_all HTTP/1.1" 200 -
Params: {'id': '3', 'name': 'value3'}
192.168.5.199 - - [03/Nov/2020 04:17:05] "POST /add_new?id=3&name=value3 HTTP/1.1" 200 -
Basically, the Python script generates the request /add_new?id=3&name=value3, while my app generates /add_new.
I added a Log.d(...) within the function getParams() and saw that she is called.