Java - простая отправка параметров HTTP с помощью метода POST

Было дано много ответов, исходя из технических соображений, особенно в отношении производительности. По моему мнению, выбор между TreeSet и HashSet имеет значение.

Но я бы скорее сказал, что выбор должен основываться на концептуальных соображениях в первую очередь.

Если для объектов, которыми нужно манипулировать, естественный порядок не имеет смысла, то не используйте TreeSet.
Это отсортированный набор, поскольку он реализует SortedSet. Таким образом, это означает, что вам нужно переопределить функцию compareTo, которая должна соответствовать возвращаемой функции equals. Например, если у вас есть набор объектов класса с именем Student, то я не думаю, что a TreeSet будет иметь смысл, поскольку между студентами нет естественного упорядочения. Вы можете заказать их по средней оценке, хорошо, но это не «естественный порядок». Функция compareTo будет возвращать 0 не только тогда, когда два объекта представляют одного и того же учащегося, но также когда два разных ученика имеют одинаковую оценку. Во втором случае equals вернет false (если вы не решите сделать последний возврат true, когда два разных ученика имеют одинаковую оценку, что сделает функцию equals вводящим в заблуждение значением, а не неверным).
Обратите внимание, что это соответствие между equals и compareTo не является обязательным, но настоятельно рекомендуется. В противном случае контракт интерфейса Set нарушается, что приводит к тому, что ваш код вводит в заблуждение других людей, что также может привести к неожиданному поведению.

Эта ссылка может быть хорошим источником информации по этому вопросу.

310
задан Imaskar says Reinstate Monica 4 May 2018 в 06:19
поделиться

1 ответ

Для тех, которые имеют проблему, получающую запрос на php странице с помощью $ _POST, потому что Вы ожидаете пары "ключ-значение":

, В то время как все ответы, где очень полезный, я испытал недостаток в некотором основном понимании, на которой строке на самом деле для регистрации с тех пор в старом апачском HttpClient я использовал

new UrlEncodedFormEntity(nameValuePairs); (Java)

и затем мог использовать $ _POST в php, действительно получают пары "ключ-значение".

К моему пониманию теперь у каждого есть сборка, которые представляют в виде строки вручную перед регистрацией. Таким образом, строка должна быть похожей

val data = "key1=val1&key2=val2"

, но вместо этого просто добавление его к URL она отправляется (в заголовке).

альтернатива должна была бы использовать json-строку вместо этого:

val data = "{\"key1\":\"val1\",\"key2\":\"val2\"}" // {"key1":"val1","key2":"val2"}

и получение по запросу это в php без $ _POST:

$json_params = file_get_contents('php://input');
// echo_p("Data: $json_params");
$data = json_decode($json_params, true);

Здесь Вы находите пример кода в Kotlin:

class TaskDownloadTest : AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void): Void? {
        var urlConnection: HttpURLConnection? = null

        try {

            val postData = JsonObject()
            postData.addProperty("key1", "val1")
            postData.addProperty("key2", "val2")

            // reformat json to key1=value1&key2=value2
            // keeping json because I may change the php part to interpret json requests, could be a HashMap instead
            val keys = postData.keySet()
            var request = ""
            keys.forEach { key ->
                // Log.i("data", key)
                request += "$key=${postData.get(key)}&"
            }
            request = request.replace("\"", "").removeSuffix("&")
            val requestLength = request.toByteArray().size
            // Warning in Android 9 you need to add a line in the application part of the manifest: android:usesCleartextTraffic="true"
            // https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted
            val url = URL("http://10.0.2.2/getdata.php")
            urlConnection = url.openConnection() as HttpURLConnection
            // urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") // apparently default
            // Not sure what these are for, I do not use them
            // urlConnection.setRequestProperty("Content-Type", "application/json")
            // urlConnection.setRequestProperty("Key","Value")
            urlConnection.readTimeout = 5000
            urlConnection.connectTimeout = 5000
            urlConnection.requestMethod = "POST"
            urlConnection.doOutput = true
            // urlConnection.doInput = true
            urlConnection.useCaches = false
            urlConnection.setFixedLengthStreamingMode(requestLength)
            // urlConnection.setChunkedStreamingMode(0) // if you do not want to handle request length which is fine for small requests

            val out = urlConnection.outputStream
            val writer = BufferedWriter(
                OutputStreamWriter(
                    out, "UTF-8"
                )
            )
            writer.write(request)
            // writer.write("{\"key1\":\"val1\",\"key2\":\"val2\"}") // {"key1":"val1","key2":"val2"} JsonFormat or just postData.toString() for $json_params=file_get_contents('php://input'); json_decode($json_params, true); in php
            // writer.write("key1=val1&key2=val2") // key=value format for 

Для тех, которые имеют проблему, получающую запрос на php странице с помощью $ _POST, потому что Вы ожидаете пары "ключ-значение":

, В то время как все ответы, где очень полезный, я испытал недостаток в некотором основном понимании, на которой строке на самом деле для регистрации с тех пор в старом апачском HttpClient я использовал

[110]

и затем мог использовать $ _POST в php, действительно получают пары "ключ-значение".

К моему пониманию теперь у каждого есть сборка, которые представляют в виде строки вручную перед регистрацией. Таким образом, строка должна быть похожей

[111]

, но вместо этого просто добавление его к URL она отправляется (в заголовке).

альтернатива должна была бы использовать json-строку вместо этого:

[112]

и получение по запросу это в php без $ _POST:

[113]

Здесь Вы находите пример кода в Kotlin:

[114]POST in php writer.flush() writer.close() out.close() val code = urlConnection.responseCode if (code != 200) { throw IOException("Invalid response from server: $code") } val rd = BufferedReader( InputStreamReader( urlConnection.inputStream ) ) var line = rd.readLine() while (line != null) { Log.i("data", line) line = rd.readLine() } } catch (e: Exception) { e.printStackTrace() } finally { urlConnection?.disconnect() } return null } }
0
ответ дан 23 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: