POST-запрос с URLConnection, похоже, работают только цифры - PullRequest
0 голосов
/ 11 августа 2011

Я пытаюсь сделать запрос к серверу с некоторыми параметрами POST, я использовал некоторый код, который я нашел здесь: Использование java.net.URLConnection для запуска и обработки HTTP-запросов

Проблема в том, что все значения становятся "0", когда я записываю их на страницу php на сервере, кроме первых чисел в ssn.Кроме того, ответ, который я получаю обратно к Java-коду, не имеет "charset = UTF-8" в члене "content-type" заголовка.Но, как вы можете видеть из кода php / html, я нигде не меняю заголовок.

Код Android:

public static String testCon()
    {
        String url = "http://xxx.xxx.se/postReciverTest.php";
        String charset = "UTF-8";
        String param1 = "Test";
        String param2 = "Test2";
        String param3 = "123456-7899";
        // ...

        String query = null;

        try
        {
            query = String.format("fname=%s&sname=%s&ssn=%s", 
                    URLEncoder.encode(param1, charset), 
                    URLEncoder.encode(param2, charset), 
                    URLEncoder.encode(param3, charset));
        } 

        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }

        URLConnection connection = null;
        try {
            connection = new URL(url).openConnection();
            } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        connection.setDoOutput(true); // Triggers POST.
        connection.setRequestProperty("Accept-Charset", charset);
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);
        OutputStream output = null;
        try {
             try {
                output = connection.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }


             try {
                output.write(query.getBytes(charset));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


        } finally {
             if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
        }

        InputStream response = null;
        try {
            response = connection.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        int status;
        try {
            status = ((HttpURLConnection) connection).getResponseCode();
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {
            System.out.println(header.getKey() + "=" + header.getValue());
        }

        String contentType = connection.getHeaderField("Content-Type");
        charset = null;
        for (String param : contentType.replace(" ", "").split(";")) {
            if (param.startsWith("charset=")) {
                charset = param.split("=", 2)[1];
                break;
            }
        }

        charset = "UTF-8"; //this is here just because the header don't seems to contain the info and i know that the charset is UTF-8 
        String res = "";
        if (charset != null) {
            BufferedReader reader = null;
            try {
                try {
                    reader = new BufferedReader(new InputStreamReader(response, charset));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                try {
                    for (String line; (line = reader.readLine()) != null;) {
                        // ... System.out.println(line) ?
                        res += line;
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } finally {
                if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
            }
        } else {
            // It's likely binary content, use InputStream/OutputStream.
        }

        return null;
    }

Страница, на которую я отправил запрос:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
Test
<?
    echo $_POST["fname"] + "<br />";
    echo $_POST["sname"] + "<br />";
    echo $_POST["ssn"] + "<br />";
?>

</body>
</html>

Итак, результат, который я получаю в переменной "res", - это HTML-кодс пометкой "00123456": "Test Test2 123456-7899"

Это не моя область, поэтому было бы неплохо, если бы ответ был довольно легок для понимания:)

Заранее спасибо!

1 Ответ

1 голос
/ 12 августа 2011

Я не использовал URLConnection и вместо этого использовал DefaultHttpClient. Вот 2 простых метода, которые отправляют GET или POST и возвращают String response

Важно отметить, где вы добавляете пары имя -> значение к объекту HttpPost: nameValuePairs.add(new BasicNameValuePair(key, params.get(key)));

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Вот пример:

Map<String, String> params = new HashMap<String, String>(3);
params.put("fname", "Jon");
params.put("ssn", "xxx-xx-xxxx");
params.put("lname", "Smith");
...
String response = execRequest("http://xxx.xxx.se/postReciverTest.php", params);

-

public static String execRequest(String url, Map<String, String> params) {
    try {
        DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
        HttpPost httpPost = null;
        HttpGet httpGet = null;
        if(params == null || params.size() == 0) {
            httpGet = new HttpGet(url);
            httpGet.setHeader("Accept-Encoding", "gzip");
        }
        else {
            httpPost = new HttpPost(url);
            httpPost.setHeader("Accept-Encoding", "gzip");

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            for(String key: params.keySet()) {
                nameValuePairs.add(new BasicNameValuePair(key, params.get(key)));
            }
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        }
        HttpResponse httpResponse = (HttpResponse)defaultHttpClient.execute(httpPost == null ? httpGet : httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        if(null != httpEntity) {
            InputStream inputStream = httpEntity.getContent();
            Header contentEncoding = httpResponse.getFirstHeader("Content-Encoding");
            if(contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
                inputStream = new GZIPInputStream(inputStream);
            }
            String responseString = Utils.convertStreamToString(inputStream);
            inputStream.close();

            return responseString;
        }
    }
    catch(Throwable t) {
        if(Const.LOGGING) Log.e(TAG, t.toString(), t);
    }
    return null;
}

public static String convertStreamToString(InputStream inputStream) {
    byte[] bytes = new byte[1024];
    StringBuilder sb = new StringBuilder();
    int numRead = 0;
    try {
        while((numRead = inputStream.read(bytes)) != -1)
            sb.append(new String(bytes, 0, numRead));
    }
    catch(IOException e) {
        if(Const.LOGGING) Log.e(TAG, e.toString(), e);
    }
    String response = sb.toString();
    if(Const.LOGGING) Log.i(TAG, "response: " + response);
    return response;
}
...