Я делаю приложение для 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, прежде чем кто-либо спросит.