#kotlin #httprequest
#kotlin #httprequest
Вопрос:
Я пытаюсь отправить запрос post, написанный на kotlin и b, используя инфраструктуру fuel (https://github.com/kittinunf/Fuel). Однако мне нужно отправить тело json с запросом post, а также базовые учетные данные для аутентификации.
Это моя текущая попытка, которая всегда приводит к HTTP-исключению 400. Итак, у меня такое чувство, что что-то не так с тем, как я отправляю тело. Я просто не могу понять, что это такое:
val myJsonBody = " {n"
" "jql": "component = LOLO AND fixVersion = '18/3 Patch-2'",n"
" "startAt": 0,n"
" "maxResults": 300,n"
" "fields": [n"
" "issuetype",n"
" "created",n"
" "status",n"
" "summary",n"
" "customfield_10002",n"
" "customfield_10003",n"
" "customfield_11201",n"
" "customfield_10006"n"
" ]n"
" }"
val confluenceUrl = "https://atc.mywebpage.net/jira/rest/api/2/search"
val (ignoredRequest, ignoredResponse, result) =
Fuel.post(confluenceUrl)
.header("Content-Type", "application/json")
.header(user,password)
.jsonBody(myJsonBody)
.responseString ()
result.fold({ print("success: $result") }, { print("failure: $result") })
Функционирующий запрос cURL, сгенерированный postman, выглядит следующим образом:
curl -X POST
https://atc.mywebpage.net/jira/rest/api/2/search
-H 'Content-Type: application/json'
-H 'Postman-Token: xxxxxxxxxxxxxxxxxxxxxxx'
-H 'cache-control: no-cache'
-d '{
"jql": "component = LOLO AND fixVersion = '''18/3 Patch-2'''",
"startAt": 0,
"maxResults": 300,
"fields": [
"issuetype",
"created",
"status",
"summary",
"customfield_10002",
"customfield_10003",
"customfield_11201",
"customfield_10006"
]
}'
Комментарии:
1. Я полагаю, вы должны использовать
.body(json.toString())
для отправки этого в виде строки.2. пытались ли вы выполнить тот же запрос с помощью других инструментов (например, cmd line, postman), чтобы проверить, корректен ли он? Кстати, в этом случае, вероятно, необработанная строка (заключенная в
"""
) была бы более читаемой3. да, я использую postman, и запрос post просто отлично работает.
4. Решение .toString() не работает.
Ответ №1:
Попробуйте выполнить этот запрос вручную. Используйте fiddler / postman / предпочитаемый вами HTTP-клиент. Может быть, вы чего-то не хватает в теле или заголовках?
Также я рекомендую использовать необработанный строковый литерал. Это намного удобнее для чтения.
val myJsonBody = """
{
"jql": "component = LOLO AND fixVersion = '18/3 Patch-2'",
"startAt": 0,
"maxResults": 300,
"fields": [
"issuetype",
"created",
"status",
"summary",
"customfield_10002",
"customfield_10003",
"customfield_11201",
"customfield_10006"
]
}
""".trimIndent()
val confluenceUrl = "https://atc.mywebpage.net/jira/rest/api/2/search"
val (ignoredRequest, ignoredResponse, result) =
Fuel.post(confluenceUrl)
.header("Content-Type", "application/json")
.header(user,password)
.jsonBody(myJsonBody)
.responseString ()
result.fold({ print("success: $result") }, { print("failure: $result") })
Комментарии:
1. В Postman запрос post работает нормально. Все, что мне нужно добавить к запросу, — это, конечно, URL-адрес запроса, тело которого в точности соответствует необработанной строке json, которую я добавил в свой проект Kotlin, и базовая аутентификация.
Ответ №2:
Я немного поиграл и обнаружил, что для правильного доступа мне пришлось использовать authentication().basic(), а не header(). Вот результат:
val confluenceUrl = "https://atc.mywebpage.net/jira/rest/api/2/search"
val user = "myUser"
val password = "myPassword"
val myJsonBody = """
{
"jql": "component = LOLO AND fixVersion = '18/3 Patch-2'",
"startAt": 0,
"maxResults": 300,
"fields": [
"issuetype",
"created",
"status",
"summary",
"customfield_10002",
"customfield_10003",
"customfield_11201",
"customfield_10006"
]
}
""".trimIndent()
val (ignoredRequest, ignoredResponse, result) =
Fuel.post(confluenceUrl)
.header("Content-Type", "application/json")
.authentication().basic(user, password)
.jsonBody(myJsonBody)
.responseString ()
result.fold({ print("success: $result") }, { print("failure: $result") })
}