Java - sending HTTP parameters via POST method easily

前端 未结 17 1654
借酒劲吻你
借酒劲吻你 2020-11-21 05:54

I am successfully using this code to send HTTP requests with some parameters via GET method

void sendRequest(String request)
{
            


        
17条回答
  •  南笙
    南笙 (楼主)
    2020-11-21 06:34

    For those having trouble receiving the request on a php page using $_POST because you expect key-value pairs:

    While all the answers where very helpful, I lacked some basic understanding on which string actually to post, since in the old apache HttpClient I used

    new UrlEncodedFormEntity(nameValuePairs); (Java)
    

    and then could use $_POST in php do get the key-value pairs.

    To my understanding now one has build that string manually before posting. So the string needs to look like

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

    but instead just adding it to the url it is posted (in the header).

    The alternative would be to use a json-string instead:

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

    and pull it in php without $_POST:

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

    Here you find a sample code in Kotlin:

    class TaskDownloadTest : AsyncTask() {
        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 $_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
        }
    }
    

提交回复
热议问题