在Android上,使用URL编码表单数据发出POST请求,而不使用UrlEncodedFormEntity

时间:2010-12-01 23:59:17

标签: android urlencode http-post

我有一个已经采用正确的URLEncoded Form格式的字符串,并希望通过Android上的POST请求将其发送到PHP服务器。我知道在Android上发送网址编码表单的方法使用UrlEncodedFormEntity,我知道how to use it。问题在于数据已经进入已编码的函数并由&符号加入,因此使用UrlEncodedFormEntity将需要进行大量额外工作才能将其转换为List NameValuePairs而我宁愿不这样做。

那么,如何将此字符串作为内容正文发送正确的POST请求?

我已尝试使用StringEntity,但PHP服务器未获取任何数据(空$_POST对象)。

我正在测试http://test.lifewanted.com/echo.json.php只是

<?php echo json_encode( $_REQUEST );

以下是已编码数据的示例:

  

partnerUserID =电子邮件%40example.com&安培; partnerUserSecret =输入mypassword&安培;命令=身份验证

1 个答案:

答案 0 :(得分:15)

如果您不介意使用HttpURLConnection代替(推荐)HttpClient,那么您可以这样做:

public void performPost(String encodedData) {
    HttpURLConnection urlc = null;
    OutputStreamWriter out = null;
    DataOutputStream dataout = null;
    BufferedReader in = null;
    try {
        URL url = new URL(URL_LOGIN_SUBMIT);
        urlc = (HttpURLConnection) url.openConnection();
        urlc.setRequestMethod("POST");
        urlc.setDoOutput(true);
        urlc.setDoInput(true);
        urlc.setUseCaches(false);
        urlc.setAllowUserInteraction(false);
        urlc.setRequestProperty(HEADER_USER_AGENT, HEADER_USER_AGENT_VALUE);
        urlc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        dataout = new DataOutputStream(urlc.getOutputStream());
        // perform POST operation
        dataout.writeBytes(encodedData);
        int responseCode = urlc.getResponseCode();
        in = new BufferedReader(new InputStreamReader(urlc.getInputStream()),8096);
        String response;
        // write html to System.out for debug
        while ((response = in.readLine()) != null) {
            System.out.println(response);
        }
        in.close();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}