use urlencoding::encode;

let encoded_key = encode(&self.api_key).to_string();
let url = format!(
    "https://api.odsay.com/v1/api/searchPubTransPathT?SX={}&SY={}&EX={}&EY={}&apiKey={}",
    sx, sy, ex, ey, encoded_key
);

So what:  API key를 URL에 넣기 전에 %인코딩한다

So why: API key에 특수문자가 포함되는 경우 인코딩 없이 그대로 URL에 넣으면 서버가 키를 잘못 파싱하여 인증 실패가 나는 에러들이 있었다. 이를 해결하고자 한글이나 특수문자들을 인코딩하였다

 

pub fn to_route_list(response: &serde_json::Value) -> RouteListResponse {
    let paths = response["result"]["path"]
        .as_array()
        .unwrap_or(&vec![])
        ...
}

So what: search_route의 raw JSON을 받아서 구조체로 변환하는 책임을 분리했다

SO why: API 호출과 파싱을 같은 함수에 넣을 경우 route.rs에서 캐시된 JSON을 재사용할 때 다시 HTTP를 호출해야하는 상황이 나온다. 하지만 분리해두면 Valkey에서 꺼낸 JSON이든 동일하게 파싱할 수 있다.

 

let lane_name = match traffic_type {
    1 => sp["lane"][0]["name"].as_str().map(|s| s.to_string()),
    2 => sp["lane"][0]["busNo"].as_str().map(|s| s.to_string()),
    _ => None,
};

So what: 지하철이면 호선명, 버스면 버스번호, 도보면 None을 넣는다

So why: Flutter에서 구간 카드에 "2호선", "146번"처럼 표시할 때 traffic_type을 다시 분기하지 않아도 lane_name만 보면 된다.

 

pub struct SegmentDetail {
    ...
    pub stations: Vec<StationPoint>, // 경유 정류장/역 (AR waypoint용)
    pub start_exit_x: Option<f64>,   // 지하철 출발 출구 좌표
    pub start_exit_y: Option<f64>,
    pub end_exit_x: Option<f64>,     // 지하철 도착 출구 좌표
    pub end_exit_y: Option<f64>,
    pub station_id: Option<i64>,
    pub bus_id: Option<i64>,
}

So what: 경로 목록용과 AR+상세용을 분리하였다

So why: Flutter 경로 목록 화면에서는 stations, 출구 좌표, bus_id 같은 필드가 필요가 없다. 하나의 구조체로 합치면 목록 API 응답 크기가 불필요하게 커지기에 용도에 따라 구조체를 나눠 각 API가 필요한 데이터만 보냈다

 

x: st["x"].as_str()
    .and_then(|s| s.parse::<f64>().ok())
    .unwrap_or(0.0),

So what: ODSAY가 좌표를 숫자가 아닌 문자열로 내려주는 걸 f64로 변환한다

So why: ODSAY API는 x, y 좌표를 "127.1234"처럼 문자열로 반환한다. .as_f64()로 파싱하면 None이 돼서 좌표가 전부0.0으로 들어가는 버그가 생긴다. 그래서 문자열로 먼저 꺼낸 다음 파싱하는 형태로 진행한다.

 

pub async fn get_bus_arrival(&self, station_id: &str) -> Result<serde_json::Value, reqwest::Error>
pub async fn get_bus_realtime(&self, bus_id: &str) -> Result<serde_json::Value, reqwest::Error>

So what: 버스 도착 예정은 station_id로, 버스 실시간 위치는 bus_id로 조회한다.

So why: 두 API의 조회 키가 다른 이유는 station_id는 정류장 기준으로 어떤 버스가 오는지 알 수 있고 bus_id는 노선 기준이라 버스의 현재 위치를 아는 용도로 사용하기 때문이다

'Project > SSAFY2학기 특화 PJT' 카테고리의 다른 글

[BE] kakao.rs ( KAKAO API )  (0) 2026.03.13
[BE, AI] 언어 선택 이유  (0) 2026.03.13
[AI] main.py ( 서버 실행 )  (0) 2026.03.13
[AI] train.py ( 모델 훈련 )  (0) 2026.03.13
[AI] preprocess.py ( 데이터 전처리 )  (0) 2026.03.13

+ Recent posts