Android / Kotlin: проблемы при отправке данных с помощью URLConnection - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь безопасно отправить данные из активности моего приложения android в сценарий php на удаленном сервере. Когда я запускаю приложение, оно не дает сбоев, и в консоли не выводится сообщение об ошибке. Однако данные, похоже, не отправляются в сценарий php.

Я попытался сузить количество строк, в которых могла возникнуть ошибка, добавив команды Log.d (...) между каждой строкой. Когда я запускаю приложение в режиме отладки, каждый Log.d (...) выводится на консоль, поэтому я ожидал, что сценарий php окажется неверным. Однако дальнейшее исследование показало, что данные не поступают в сценарий php, поскольку $ score = $ _POST ["score"] не содержит ожидаемого значения. Кроме того, если я произвольно изменяю URL-адрес для запроса и снова запускаю приложение, сообщение об ошибке также не появляется. Поэтому я ожидаю, что ошибка находится где-то между url.openConnection () и urlConnection.connect () в файле MyActivity.kt.

Question

Почему код не отправляет данные в скрипт и как это исправить?

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        this.configureNetworkRunnable()
    }
   
    private fun configureNetworkRunnable() {
        Thread( Runnable {
            uploadData()
        }).start()
    }

    private fun uploadData() {
        val charset = "UTF-8"
        val parameter = URLEncoder.encode("param1", charset) + "=" + URLEncoder.encode("20", charset)

        val url = URL("https://www.myurl.com/path/file.php")
        val urlConnection = url.openConnection()
        urlConnection.setDoOutput(true)

        val outputStream: OutputStream = urlConnection.getOutputStream()
        outputStream.write(parameter.toByteArray(Charsets.UTF_8))
        urlConnection.connect()
    }
}

GameActivity.kt

<?php
    $param1 = $_POST["param1"];
    ...

файл. php

D/NetworkSecurityConfig: No Network Security Config specified, using platform default
D/OpenGLRenderer: makeCurrent EglSurface : 0x7cf3783000 -> 0x7cf3783b00
D/ViewRootImpl@1b125bd[GameActivity]: MSG_RESIZED: frame=(112,0,2280,1080) ci=(0,0,0,0) vi=(0,0,0,0) or=2
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
D/TcpOptimizer: TcpOptimizer-ON
D/libmdf: libmdf v2.9.0.0 On 64bit PLATFORM
D/OpenGLRenderer: destroyEglSurface : 0x7cf3783000
I/mali_egl: eglDestroySurface() in
I/mali_winsys: delete_surface() [2168x1080] return
I/mali_egl: eglDestroySurface() out
W/libEGL: EGLNativeWindowType 0x7d82347810 disconnect failed
D/OpenGLRenderer: ~ReliableSurface : 0x7d82347800
D/ViewRootImpl@fc1415c[MainActivity]: Relayout returned: old=(112,0,2280,1080) new=(112,0,2280,1080) req=(2168,1080)8 dur=10 res=0x5 s={false 0} ch=true
D/ViewRootImpl@fc1415c[MainActivity]: stopped(true) old=false
V/ViewRootImpl@fc1415c[MainActivity]: updateAppliedLetterboxDirection, direction=0, Caller=android.view.ViewRootImpl.handleDispatchLetterboxDirectionChanged:8044

console

Заранее благодарю

1 Ответ

1 голос
/ 07 августа 2020

Поскольку протокол этого URL-адреса - «https», преобразуйте URLConnection в HttpsURLConnection. Затем, поскольку мы отправляем данные, установите метод запроса на «POST». Мы также установим тип содержимого отправляемых данных, чтобы наш сценарий знал, чего ожидать. Таким образом, конструкция этого HttpsURLConnection должна выглядеть так:

val urlConnection = url.openConnection() as HttpsURLConnection
urlConnection.apply {
  requestMethod = "POST"
  doOutput = true
  setRequestProperty("Content-Type", "application/octet-stream")
}

Также не похоже, что вы правильно закрываете свой поток после отправки данных. Попробуйте:

urlConnection.outputStream.use { stream ->
  stream.write("20".toByteArray(Charsets.UTF_8))
}

, который запишет байты в ваш поток и обработает его закрытие для вас, исключение или нет.

Наконец, вы должны полностью прочитать inputStream, поэтому попробуйте:

urlConnection.inputStream.bufferedReader().use {
  it.readText()
}

Если проблема не исчезла, распечатайте, чтобы записать в журнал свой urlConnection.responseCode и, при желании, it.readText() для меня.

...