Конвертировать curl POST в HttpURLConnection (Kotlin) - PullRequest
0 голосов
/ 13 февраля 2019

Я делаю приложение для Android, которое будет иметь модуль отчетов об ошибках, использующий API-интерфейс YouTrack REST

GET работает нормально - я могу получить все данные без проблем в настоящее время (например, получить все проблемы)

Я борюсь с методом POST.Согласно Документация YouTrack это пример запроса на добавление новой проблемы:

curl -X POST \
'http://<url>/api/issues?fields=reporter%28login,name%29,idReadable,id,project%28id,name,leader%28login,name%29%29,summary,description' \
-H 'Authorization: Bearer xyz' \
-H 'Accept: application/json' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"project":{"id":"0-0"},
"summary":"REST API lets you create issues!",
"description":"Let'\''s create a new issue using YouTrack'\''s REST API."
}'

Все хорошо, когда я копирую вышеупомянутое, это работает и правильно добавляет проблему в youtrack

Проблемы начинаются, когда я пытаюсь сделать то же самое из Kotlin.Я попробовал следующее:

val request = "api/issues?fields=reporter%28login,name%29,idReadable,id,project%28id,name,leader%28login,name%29%29,summary,description"
val url = URL("<url>$request")
val connection = url.openConnection() as? HttpURLConnection
connection?.requestMethod = "POST"

connection?.addRequestProperty("Authorization","Bearer xyz")
connection?.addRequestProperty("Accept","application/json")
connection?.addRequestProperty("Cache-Control","no-cache")
connection?.addRequestProperty("Content-Type","application/json")

connection?.useCaches = false
connection?.doInput = true
connection?.doOutput = true

val data = ArrayList<String>()
data.add("\"project\":{\"id\":\"0-0\"}")
data.add("\"summary\":\"REST API lets you create issues\"")
data.add("\"description\":\"New Issue\"")

val result = data.joinToString(separator = ",\n").toByteArray(Charsets.UTF_8)
connection?.outputStream?.write(result)
connection?.outputStream?.close()

connection?.connect()

val responceCode = connection?.responseCode
if(responceCode != null && responceCode < 400)
    Log.d("FP-YT", "Responce code: $responceCode")
else{
    //responceCode = 500
    val errors = connection?.errorStream?.read() //errors is "60"
    val message = connection?.responseMessage  //message is "Request failed."

    Log.e("FP-YT", "Responce code: $responceCode:,\n$errors\n$message")
}

val inputStream = connection?.inputStream  //here is FileNotFoundException
val reader = InputStreamReader(inputStream)
val br = BufferedReader(reader)
return br.readText()

Как уже упоминалось в коде выше, он завершается с ошибкой http 500 (errorStream содержит только число 60), а responseMessage одинаково описательный Request failed..

Протокол http, прежде чем кто-либо спросит.

...