POST数据不是通过HttpURLConnection发送的

时间:2016-08-16 22:44:57

标签: java android post

我正在尝试通过HttpURLConnection发送POST请求,这是代码

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为200表示一切正常,但是它显示Undefined index: id

id在php文件中定义良好

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

当我从html文件发送post请求时它工作正常但是当我从应用程序发送它时,它说id未定义,这意味着POST数据没有被发送。

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

这是我在主要活动中实例化asynctask对象的方法

UPDATE :当我发送未编码的字符串时,它工作正常! writer.write( “ID = 5”); //完美地运作! 我在代码中使用的URLEncoder有什么问题?

2 个答案:

答案 0 :(得分:4)

我相信你在这一行有问题:

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

您正在对=以及参数进行网址编码,这就是服务器无法识别表单字段的原因。尝试仅对params进行编码:

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

原因是URL编码用于在值(或键)中传递=之类的特殊字符。基本上,服务器将在执行解码之前使用&=拆分和解析键值对。当你对=字符进行url-encode时,服务器在拆分和解析阶段就无法识别它。

答案 1 :(得分:0)

当我需要与服务器通信时,我使用此

服务器类

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);