Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C++273
  • C#210

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD919
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме KtorВсе вопросы
KtorJuniorТеория

В чём разница между respondText, respond и call.respond() в Ktor?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

respondText() — удобная обёртка для ответа строкой с Content-Type text/plain. respond() — универсальный метод для любого объекта с сериализацией или ApplicationResponse. call.respond() — то же самое, вызывается через ApplicationCall.

Три способа отправить ответ

В Ktor все три функции доступны внутри обработчика маршрута через объект call: ApplicationCall. Разница — в уровне абстракции и типе содержимого.

respondText

Специализированная функция для отправки текста. Устанавливает Content-Type: text/plain (или другой, если указать явно):

get("/hello") {
    call.respondText("Hello, World!") // 200, text/plain; charset=UTF-8
}

get("/html") {
    call.respondText(
        text = "<h1>Hi</h1>",
        contentType = ContentType.Text.Html,
        status = HttpStatusCode.OK
    )
}

get("/csv") {
    call.respondText(
        contentType = ContentType.Text.CSV,
        status = HttpStatusCode.OK
    ) {
        // Производящий лямбда — строка генерируется лениво
        buildString {
            appendLine("id,name")
            appendLine("1,Alice")
        }
    }
}

respond

call.respond() — универсальный метод. Принимает любой объект; если установлен плагин ContentNegotiation, объект будет сериализован в JSON/XML/etc. согласно заголовку Accept клиента:

import io.ktor.server.response.*
import io.ktor.http.*
import kotlinx.serialization.Serializable

@Serializable
data class User(val id: Int, val name: String)

get("/user") {
    // Ответ JSON (если ContentNegotiation с json() установлен)
    call.respond(User(1, "Alice"))
}

get("/no-content") {
    call.respond(HttpStatusCode.NoContent) // 204 без тела
}

get("/created") {
    call.respond(HttpStatusCode.Created, User(2, "Bob")) // 201 + JSON
}

get("/bytes") {
    val data = byteArrayOf(0x89.toByte(), 0x50, 0x4E, 0x47) // PNG header
    call.respond(ByteArrayContent(data, ContentType.Image.PNG))
}

Разница между respond и call.respond

Фактически это одно и то же: внутри блока маршрута this — это PipelineContext, а call — свойство этого контекста. Обе записи компилируются в одно:

get("/same") {
    respond("Using extension")        // то же самое
    call.respond("Using call property") // что и это
    // Но вызывать оба нельзя! Ответ уже отправлен после первого.
}

respondBytes и respondFile

get("/image") {
    val bytes = File("logo.png").readBytes()
    call.respondBytes(bytes, ContentType.Image.PNG)
}

get("/download") {
    val file = File("report.pdf")
    call.response.header(
        HttpHeaders.ContentDisposition,
        ContentDisposition.Attachment.withParameter(
            ContentDisposition.Parameters.FileName, "report.pdf"
        ).toString()
    )
    call.respondFile(file)
}

Подводные камни

  • После вызова любой функции respond*() обработчик должен завершиться — повторный вызов вызовет исключение IOException: Response has already been sent.
  • call.respond(someObject) без установленного ContentNegotiation выбросит исключение — объект не будет знать, как себя сериализовать.
  • respondText всегда возвращает text/plain если не указать contentType явно; клиент может неверно интерпретировать HTML-строку без явного указания ContentType.Text.Html.
  • Используйте return@get (или return@post) после respond внутри условных веток, иначе выполнение продолжится до следующего respond и упадёт.
  • Статус-код по умолчанию — 200; для ошибок нужно явно передавать HttpStatusCode.BadRequest и т.д., иначе клиент получит 200 с телом ошибки.

Типичные ошибки

  • Путать термин «respond respondtext callrespond» с соседним механизмом Ktor.
  • Не называть границу lifecycle, transaction, thread или request для «respond respondtext callrespond».
  • Игнорировать production-эффекты «respond respondtext callrespond»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «respond respondtext callrespond» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «respond respondtext callrespond».
  • Уточнить, какие настройки или API меняют «respond respondtext callrespond» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Ktor →

Источники

  • https://ktor.io/docs/server-routing.html

Связанные темы

Ktorbackend-designktortechnical-communication

Частые вопросы на собеседовании

  • Какие security-риски возникают в Ktor при CORS, JWT/session auth и обработке multipart-загрузок?
  • Каковы варианты production-деплоя приложения Ktor?
  • Как определять маршруты (routes) в Ktor и как работает вложенная маршрутизация?
  • Что такое plugins (ранее features) в Ktor и как их устанавливать?