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<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 $_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 } }
http://example.com/index.php)con.getResponseCode()