Как передать параметр URL с помощью Ktor Kotlin и HttpClient?

Я хочу использовать API Google Книг, поэтому у меня есть поле поиска, чтобы найти книгу по ее номеру. Я использую Kotlin с Ktor и интерфейс с HTML/CSS. С классом маршрутизации я хочу вызвать API при нажатии на поле поиска и передать параметр для построения всего URL-адреса и возврата данных json.

Проблема в том, что когда я пытаюсь передать параметр в класс маршрутизации, читая параметры формы, ничего не происходит, и страница не перенаправляется на мою страницу поиска.

Итак, как я могу создать это, чтобы передать isbn в поле поиска и создать правильный URL-адрес для вызова API?

Маршрутизация.kt:

fun Application.configureRouting() {

routing {
    static("/static") {
        resources("files")
    }
    get("/") {
        call.respondRedirect("books")
    }

    route("search") {
        get {
            call.respond(FreeMarkerContent("search.ftl", model = null))
        }

        get("field") {
            val formParameters = call.receiveParameters()
            val isbn = formParameters.getOrFail("isbn").toLong()
            val client = HttpClient(CIO)
            val response: HttpResponse = client.get("https://www.googleapis.com/books/v1/volumes?q=isbn:$isbn")
            println(response.status)
            val stringBody: String = response.body()
            println(stringBody)
            client.close()
            call.respondRedirect("/search")
        }
    }
}
}

Когда я удаляю эти две строки и добавляю isbn прямо в URL-адрес, я получаю ответ json:

val formParameters = call.receiveParameters()
val isbn = formParameters.getOrFail("isbn").toLong()

URL для тестирования:

 val response: HttpResponse = client.get("https://www.googleapis.com/books/v1/volumes?q=isbn:9783453528420")

search.ftl:

<#import "_layout.ftl" as layout />
<@layout.header>
    <div>
        <div class = "text-center">
            <h1 class = "display-4">Search</h1>
        </div>
        <div class = "container">
            <div class = "row">
                <div class = "form-group has-search">
                    <span class = "fa fa-search form-control-feedback"></span>
                    <form action = "/search/field" method = "get">
                    <input type = "text" class = "form-control" name = "isbn">
                    </form>
                </div>
            </div>
</@layout.header>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
0
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Форма отправляется как GET. GET не имеют параметров формы, но имеют параметры запроса.

Код на стороне сервера ожидает GET, но пытается прочитать параметр формы.

Попробуйте изменить строку на

val isbn = call.request.queryParameters.getOrFail("isbn").toLong()

Я не тестировал этот код, но решение можно найти с помощью queryParameters.

Другие вопросы по теме