Giorgio L
Giorgio L

Reputation: 75

POST data not sent via HttpURLConnection

I'm trying to send POST request via HttpURLConnection, here is the code

public class BackgroundTask extends AsyncTask<String, Void, Void> {
    Context context;
    Activity activity;
    StringBuffer str = null;
    int responseCode;
    String responseMessage;

    public BackgroundTask(Context context) {
        this.context = context;
        this.activity = (Activity) context;
    }

    @Override
    protected Void doInBackground(String... params) {
        HttpURLConnection connection = null;

        OutputStream outputStream = null;
        InputStream inputStream = null;

        BufferedReader reader = null;
        BufferedWriter writer = null;

        String method = params[1];

        if(method.equals("post")) {
            try {
                URL url = new URL(params[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

                outputStream = connection.getOutputStream();
                writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));

                String data = URLEncoder.encode(params[2] + "=" + params[3], "UTF-8");
                writer.write(data);
                responseCode = connection.getResponseCode();
                responseMessage = connection.getResponseMessage();
                inputStream = connection.getInputStream();
                reader = new BufferedReader(new InputStreamReader(inputStream));
                str = new StringBuffer();

                String line = "";

                while ((line = reader.readLine()) != null) {
                    str.append(line);
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (connection != null)
                    connection.disconnect();
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (writer != null) {
                    try {
                        writer.flush();
                        writer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (outputStream != null) {
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        } else if(method.equals("get")) {

        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        TextView txt = (TextView) activity.findViewById(R.id.txt);
        if(str != null)
            txt.setText(str.toString());
        Toast.makeText(activity, responseMessage, Toast.LENGTH_LONG).show();
    }
}

responseCode is 200 which means everything went OK, however it says Undefined index: id

id is well defined inside php file

$user = User::find_by_id($_POST['id']);
echo json_encode($user);

and it works fine when I send post request from an html file yet when i send it from application it says id undefined which means that POST data is not sent.

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        BackgroundTask myTask = new BackgroundTask(MainActivity.this);
        myTask.execute(link, "post", "id", "5");
    }
});

this is how i instantiate asynctask object inside main activity

UPDATE: when i send not encoded string it works fine! writer.write("id=5"); // works perfectly! what is wrong with URLEncoder i use in the code?

Upvotes: 1

Views: 825

Answers (2)

xiaofeng.li
xiaofeng.li

Reputation: 8587

I believe you have a problem in this line:

String data = URLEncoder.encode(params[2] + "=" + params[3], "UTF-8");

You are url-encoding the = as well as the params, that's why the server cannot recognise the form fields. Try to encode the params only:

String data = URLEncoder.encode(params[2], "UTF-8") + "=" + URLEncoder.encode(params[3], "UTF-8");

The reason is that URL encoding is for passing special characters like = in the value(or key). Basically, the server will split and parse the key-value pairs with & and = before doing the decoding. And when you url-encode the = character, the server simply couldn't recognise it during the split and parse phase.

Upvotes: 4

Tiago Oliveira
Tiago Oliveira

Reputation: 1602

When i need to communicate with the server i use this

Server Class

public static String sendPostRequest(String requestURL,
                                     HashMap<String, String> postDataParams) {

    URL url;
    String response = "";
    try {
        url = new URL(requestURL);

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(15000);
        conn.setConnectTimeout(15000);
        conn.setRequestMethod("POST");
        conn.setDoInput(true);
        conn.setDoOutput(true);


        OutputStream os = conn.getOutputStream();
        BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(os, "UTF-8"));
        writer.write(getPostDataString(postDataParams));

        writer.flush();
        writer.close();
        os.close();
        int responseCode = conn.getResponseCode();

        if (responseCode == HttpsURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            response = br.readLine();
        } else {
            response = "Error Registering";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return response;
}

private static String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
    StringBuilder result = new StringBuilder();
    boolean first = true;
    for (Map.Entry<String, String> entry : params.entrySet()) {
        if (first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
    }

    return result.toString();
}

OtherClass

 //Run this inside an Asynctask
 HashMap<String,String> data = new HashMap<>();
            data.put("id", id);
 String serverResponce = Server.sendPostRequest(URL,data);

Upvotes: 0

Related Questions