본문 바로가기
Rust/프로젝트

Rust로 백엔드 개발기(feat. 메이플스토리) - 10 Not Found 처리, request 통합

by lms0806 2025. 4. 13.
728x90

이번 시간에는 요청을 하는 url이 일치하지 않는 경우에 대한 처리, request로 들어온 정보에 따라 url를 변경하여 요청하는 방식에 대해 배워보고자 합니다.

없는 url로 요청

백엔드에 정의되지 않은 url로 요청시, 해당 주소를 찾을 수 없습니다. Not Found를 출력하도록 하기 위해서는, Routerfallback함수를 추가해주면 됩니다.

 

다음과 같이 message가 정의된 struct 구조체를 선언해주고, fallback() 함수에 IntoResponse를 상속받아서 BAD_REQUEST를 출력하도록 진행하면 됩니다.

use axum::response::IntoResponse;

#[derive(Serialize)]
struct ErrorResponse {
    message: &'static str,
}

async fn fallback() -> impl IntoResponse {
    (
        StatusCode::BAD_REQUEST,
        Json(ErrorResponse {
            message: "Not Found",
        }),
    )
}

해당 함수를 각 router 함수들이 포함되어 있는 get_routes()에 추가해주면 됩니다.

ub fn get_routes() -> Router {
    Router::new()
        .merge(user_routes())
        .merge(guild_route())
        .merge(notice_route())
        .merge(union_route())
        .merge(ranking_route())
        .fallback(fallback)
}

동일한 request 방식 통합

maple open api request 방식을 보면, 'https://open.api.nexon.com/maplestory/v1/ 다음 공통 url로 시작하고, 이후에는 각각 character, notice 등등 종류별 명칭들로 시작합니다.

 

그리고, header에 x-nxopen-api-key:{api-key}방식으로 요청을 보냅니다.

 

그렇게 받아온 response를 받아오고, 이를 각각 함수들에 반환하여, json 값을 각 함수별 선언된 struct별로 받아서 출려해주면 됩니다.

pub async fn request_parser(api_key: Arc<API>, kind: &str, user_ocid: &str) -> reqwest::Response {
    // 요청 헤더 정의
    let mut headers = header::HeaderMap::new();
    headers.insert("x-nxopen-api-key", api_key.key.parse().unwrap());

    let url = format!(
        "https://open.api.nexon.com/maplestory/v1/character/{}?ocid={}",
        kind, user_ocid
    );

    // POST 요청 보내기
    let response = Client::new()
        .get(url)
        .headers(headers)
        .send()
        .await
        .expect("Failed to send request");

    return response;
}
728x90

댓글