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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

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

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

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

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

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

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

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

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

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое FromRequest и FromRequestParts в Axum? Когда следует их реализовывать?

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

FromRequestParts извлекает данные только из заголовков/URI (не потребляет тело), FromRequest может читать тело запроса; первый следует использовать для аутентификации и параметров пути.

Реализация FromRequestParts — извлечение JWT из заголовка

use axum::{
    async_trait,
    extract::FromRequestParts,
    http::{request::Parts, StatusCode},
};

struct AuthUser {
    user_id: i64,
}

#[async_trait]
impl<S> FromRequestParts<S> for AuthUser
where
    S: Send + Sync,
{
    type Rejection = (StatusCode, &'static str);

    async fn from_request_parts(
        parts: &mut Parts,
        _state: &S,
    ) -> Result<Self, Self::Rejection> {
        let token = parts
            .headers
            .get("Authorization")
            .and_then(|v| v.to_str().ok())
            .and_then(|v| v.strip_prefix("Bearer "))
            .ok_or((StatusCode::UNAUTHORIZED, "missing token"))?;

        let user_id = verify_jwt(token)
            .map_err(|_| (StatusCode::UNAUTHORIZED, "invalid token"))?;

        Ok(AuthUser { user_id })
    }
}

async fn profile(user: AuthUser) -> String {
    format!("user_id = {}", user.user_id)
}

Разница между FromRequest и FromRequestParts

Axum разделяет экстракцию данных на два трейта в зависимости от того, нужен ли доступ к телу запроса:

  • FromRequestParts — работает только с Parts (метод, URI, заголовки, extensions). Тело не потребляется. Можно использовать несколько раз, в том числе в middleware.
  • FromRequest — получает полный Request включая тело. Тело можно прочитать только один раз, поэтому в сигнатуре хендлера должен быть не более одного экстрактора, реализующего FromRequest (например Json<T>, Bytes, String).

Реализация FromRequest — кастомный JSON с валидацией

use axum::{
    async_trait,
    extract::{FromRequest, Request},
    http::StatusCode,
    Json,
};
use serde::de::DeserializeOwned;
use validator::Validate;

struct ValidJson<T>(T);

#[async_trait]
impl<T, S> FromRequest<S> for ValidJson<T>
where
    T: DeserializeOwned + Validate,
    S: Send + Sync,
{
    type Rejection = (StatusCode, String);

    async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> {
        let Json(value) = Json::<T>::from_request(req, state)
            .await
            .map_err(|e| (StatusCode::BAD_REQUEST, e.to_string()))?;

        value.validate()
            .map_err(|e| (StatusCode::UNPROCESSABLE_ENTITY, e.to_string()))?;

        Ok(ValidJson(value))
    }
}

Доступ к State внутри экстрактора

Если экстрактору нужен доступ к состоянию приложения, используйте FromRef:

use axum::extract::{FromRef, FromRequestParts};

#[async_trait]
impl<S> FromRequestParts<S> for AuthUser
where
    AppState: FromRef<S>,
    S: Send + Sync,
{
    type Rejection = StatusCode;

    async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, StatusCode> {
        let app_state = AppState::from_ref(state);
        // используем app_state.jwt_secret для верификации
        todo!()
    }
}

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

  • Если реализовать FromRequest там, где достаточно FromRequestParts, экстрактор нельзя использовать совместно с Json<T> — они оба потребуют тело и компилятор откажется.
  • async_trait по-прежнему требуется вплоть до стабилизации async fn in traits в Rust; без него компилятор выдаёт ошибку об object-safety.
  • Тип Rejection должен реализовывать IntoResponse; использование String напрямую не сработает — оберните в (StatusCode, String).
  • Порядок параметров в хендлере важен: FromRequestParts-экстракторы должны идти до FromRequest-экстракторов (Axum проверяет это статически).
  • Паника внутри from_request убьёт worker-поток Tokio; всегда возвращайте Err вместо panic!.
  • Не читайте body дважды: после того как тело потреблено одним экстрактором, другой получит пустые байты без ошибки.
  • При использовании axum::middleware::from_fn нельзя напрямую использовать экстракторы — нужно вызывать Parts::extract::<T>() вручную.
  • Изменения в Parts::extensions внутри экстрактора видны последующим экстракторам — это удобно для цепочки, но может породить неочевидные зависимости между хендлерами.

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://docs.rs/axum/latest/axum/
←Предыдущий вопросКак реализовать общее состояние приложения в Axum с помощью `State<T>`?Следующий вопрос→Как работает middleware в Axum? Как он использует трейты `Service` и `Layer` из Tower?

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

Axumaxum-productionAxum (Rust)risk-analysistechnical-depth

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

  • В каких backend-проектах Axum (Rust) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Какие production-риски есть у Axum (Rust): blocking code, connection pooling, config, auth, observability, deploy или graceful shutdown?
  • Как понять, что проблема в сервисе связана с Axum (Rust), а не с базой, сетью, инфраструктурой или бизнес-логикой?
  • Проект на Axum (Rust) вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?