опубликовать запрос с информацией о нескольких заголовках с использованием топлива

#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") })
}