MST
星途 面试题库

面试题:Rust中复杂场景下命名参数灵活配置及错误处理

假设你正在开发一个网络请求库,`send_request`函数需要配置`url`(字符串类型)、`method`(枚举类型,包含`GET`、`POST`等)、`headers`(一个`HashMap<String, String>`)、`body`(`Option<Vec<u8>>`)等参数。请使用命名参数方式实现这个函数,并处理可能出现的参数配置错误,例如无效的`url`格式,不支持的`method`等,同时要考虑参数配置的灵活性,允许部分参数缺省。
22.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::collections::HashMap;
use std::fmt::Display;
use std::net::Uri;

#[derive(Debug)]
enum Method {
    GET,
    POST,
}

#[derive(Debug)]
enum RequestError {
    InvalidUrl,
    UnsupportedMethod,
}

impl Display for RequestError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            RequestError::InvalidUrl => write!(f, "Invalid URL"),
            RequestError::UnsupportedMethod => write!(f, "Unsupported method"),
        }
    }
}

fn send_request(
    url: Option<&str>,
    method: Option<Method>,
    headers: Option<HashMap<String, String>>,
    body: Option<Vec<u8>>,
) -> Result<(), RequestError> {
    let url = match url {
        Some(u) => match Uri::try_from(u) {
            Ok(uri) => uri,
            Err(_) => return Err(RequestError::InvalidUrl),
        },
        None => return Err(RequestError::InvalidUrl),
    };

    let method = match method {
        Some(m) => m,
        None => return Err(RequestError::UnsupportedMethod),
    };

    let headers = headers.unwrap_or_default();
    let body = body.unwrap_or_default();

    // 这里可以进行实际的网络请求操作,暂时省略
    println!("Request to: {:?}, Method: {:?}, Headers: {:?}, Body: {:?}", url, method, headers, body);

    Ok(())
}

你可以通过以下方式调用这个函数:

fn main() {
    let mut headers = HashMap::new();
    headers.insert("Content-Type".to_string(), "application/json".to_string());

    let result = send_request(
        Some("https://example.com"),
        Some(Method::GET),
        Some(headers),
        Some(b"test body".to_vec()),
    );

    match result {
        Ok(_) => println!("Request sent successfully"),
        Err(e) => println!("Error: {}", e),
    }
}