You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust Warp的JSON响应中格式化私钥换行?

在Rust Warp框架中调整OAuth私钥的JSON输出格式

我在Web应用中使用Rust的Warp框架生成OAuth公私钥对,并通过API端点以JSON格式返回给用户。当前返回的JSON里,私钥字符串末尾带有一个转义的换行符\n(见下方实际输出),希望去掉这个多余的换行,让私钥结尾恰好是-----END PRIVATE KEY-----(见下方期望输出)。以下是相关代码,请问如何实现这个需求?

实际输出

{
    "token_uri": "http://example.com/token",
    "kid": "keyid",
    "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC/Z0MgEolvLiwM\nNWpRR+xN6+sXNZh9HU7ignGMgieHz147D/ti7kD1cb14F9Sfp2CewfjwapdMjkhF\n/7sytl54ylNV5ID9EIBDlbbJ78IdEu4CzvbdhBP32k5IEQCACI4wMQmqLRj01Wbg\nl0ihNPkNFkuVxfmSC5ozJuiVXsR/rCg7GP9w880tkJI50ZoUNwClaLOXWph151Es\njc0HDgrYaDISzLB8qLxEBQCTBLz9OWz38rV0bfLGnBRYZjFx4gzkuZbjJfE2w3XQ\nuAl08A0THdNztffoWQLED98jxBj3Y5PRsiC9oqccKb51crohYe426GnfiaAGiPQy\njGI+2ZBRAgMBAAECggEAS+VjbZ1MF+UEHFc18EMHxaIt10cuTzZG6HR3GBMoH6cv\no1XkBceZxHm0eqFgc2pIWstprdNmaTnmGLOeBC7iaR05TE7Ogwp/Ac2k7JAAtcyi\nykRNCWttC5PqBJORUjOSRjO7tForkjHomFgEub+qnfDgSeR14N5u56efBFPOsRzf\nIjAMO6lkYcGHa9hFSpzCNp319gH4yIXL+jXUs+3oyOruHVWHtRVTriGZ7eFgs6lU\ngSt6+1V59gKjQtYHWWVEsE3f9YIB2zmFaQWHsK1qK3CAf5lNhsfDMXFNrNWSu+SB\nMPWcNdxY7tdbfjPC4srJSs/YIfhEhuqLK6cR6Z8gwQKBgQD4dNluCVPIllWiPi95\npeztrYDVmVYVDU0XKZ01EDqydDWJyUWYuMG77g/vPokrYHRB+rCYTDbpsO3d7qB9\ntJoTOhJ1juPqmgbUwZEKokb64KKg+JMGH0elAD0mlIcxrkkvppapA/WGTXV84Nf8\n4tTCWKoyUiyi8jZfby8rIpzAiQKBgQDFNvZraXsTcdikQQcAGclK6zdAVf0J1OE6\nb1zZFQhlao38hWz/NdbvwHvtqhNgx7r9eO3Jg250atFHm8YD+OTQPz2xBecbTBeY\n/F3tiD6NiL2TClBlaB7aR9KchaFypOmtR02UFPh4o0cX03s8D8qmr30MOBkjqgxm\nspNU35qPiQKBgQCdVnHyqtlx5zHngnXSFW9KvFsf6PCIeFnfVy0E03g4VjspPFpk\ncmvNNN7GZNW8sGIu/jAi4fDMYIzhxCHCOUJw9o+F/qz6ffvhc4sELuvAJ80VHxUM\nBXb7WIFhEyHiJjqWgGpcMfOjzx2drU1aCdMuF7QAFeXKcpRYLzKxoEOf8QKBgQCx\nw14Q6a4vk8HkJF0sARJI/oX57sg70XAG3RSC9AtyZr5/LMFXtW79ArJyQohfBwmM\nqjEkH90zAImNk2LEd9e/whFYfGqZV1g55NjBX7qKlwPSA0z+awDMXksAHQ+up+md\n8BSEcvaYvww49L4zIETZRHthxTsbw46UD0jwCvFliQKBgHfJRPg9u2OCZF+jOtK2\nswI2r+4/q7Ki7mBuHlnceRDfgb+1lvv2QmM0M/p6ijf7/SequksdJSr2jLmCp/K3\nHwSFaGgoHSt/nkcCCi7LR9fhM2MeLrEIV4E937Ii2wkt5/JXGwwYPbadELPb84On\nq0oUrqcHheFb4aCv1N5io6ok\n-----END PRIVATE KEY-----\n"
}

期望输出

{
    "token_uri": "http://example.com/token",
    "kid": "keyid",
    "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC/Z0MgEolvLiwM\nNWpRR+xN6+sXNZh9HU7ignGMgieHz147D/ti7kD1cb14F9Sfp2CewfjwapdMjkhF\n/7sytl54ylNV5ID9EIBDlbbJ78IdEu4CzvbdhBP32k5IEQCACI4wMQmqLRj01Wbg\nl0ihNPkNFkuVxfmSC5ozJuiVXsR/rCg7GP9w880tkJI50ZoUNwClaLOXWph151Es\njc0HDgrYaDISzLB8qLxEBQCTBLz9OWz38rV0bfLGnBRYZjFx4gzkuZbjJfE2w3XQ\nuAl08A0THdNztffoWQLED98jxBj3Y5PRsiC9oqccKb51crohYe426GnfiaAGiPQy\njGI+2ZBRAgMBAAECggEAS+VjbZ1MF+UEHFc18EMHxaIt10cuTzZG6HR3GBMoH6cv\no1XkBceZxHm0eqFgc2pIWstprdNmaTnmGLOeBC7iaR05TE7Ogwp/Ac2k7JAAtcyi\nykRNCWttC5PqBJORUjOSRjO7tForkjHomFgEub+qnfDgSeR14N5u56efBFPOsRzf\nIjAMO6lkYcGHa9hFSpzCNp319gH4yIXL+jXUs+3oyOruHVWHtRVTriGZ7eFgs6lU\ngSt6+1V59gKjQtYHWWVEsE3f9YIB2zmFaQWHsK1qK3CAf5lNhsfDMXFNrNWSu+SB\nMPWcNdxY7tdbfjPC4srJSs/YIfhEhuqLK6cR6Z8gwQKBgQD4dNluCVPIllWiPi95\npeztrYDVmVYVDU0XKZ01EDqydDWJyUWYuMG77g/vPokrYHRB+rCYTDbpsO3d7qB9\ntJoTOhJ1juPqmgbUwZEKokb64KKg+JMGH0elAD0mlIcxrkkvppapA/WGTXV84Nf8\n4tTCWKoyUiyi8jZfby8rIpzAiQKBgQDFNvZraXsTcdikQQcAGclK6zdAVf0J1OE6\nb1zZFQhlao38hWz/NdbvwHvtqhNgx7r9eO3Jg250atFHm8YD+OTQPz2xBecbTBeY\n/F3tiD6NiL2TClBlaB7aR9KchaFypOmtR02UFPh4o0cX03s8D8qmr30MOBkjqgxm\nspNU35qPiQKBgQCdVnHyqtlx5zHngnXSFW9KvFsf6PCIeFnfVy0E03g4VjspPFpk\ncmvNNN7GZNW8sGIu/jAi4fDMYIzhxCHCOUJw9o+F/qz6ffvhc4sELuvAJ80VHxUM\nBXb7WIFhEyHiJjqWgGpcMfOjzx2drU1aCdMuF7QAFeXKcpRYLzKxoEOf8QKBgQCx\nw14Q6a4vk8HkJF0sARJI/oX57sg70XAG3RSC9AtyZr5/LMFXtW79ArJyQohfBwmM\nqjEkH90zAImNk2LEd9e/whFYfGqZV1g55NjBX7qKlwPSA0z+awDMXksAHQ+up+md\n8BSEcvaYvww49L4zIETZRHthxTsbw46UD0jwCvFliQKBgHfJRPg9u2OCZF+jOtK2\nswI2r+4/q7Ki7mBuHlnceRDfgb+1lvv2QmM0M/p6ijf7/SequksdJSr2jLmCp/K3\nHwSFaGgoHSt/nkcCCi7LR9fhM2MeLrEIV4E937Ii2wkt5/JXGwwYPbadELPb84On\nq0oUrqcHheFb4aCv1N5io6ok\n-----END PRIVATE KEY-----"
}

相关代码

结构体定义

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClientKey {
    pub token_uri: String,
    pub kid: String,
    pub private_key: String,
}

函数返回逻辑

Ok(ClientKey {
    kid, // 使用rand crate生成的随机ID
    private_key: format!("{}", pvt_key), // 实际代码中由openssl生成并从函数返回
    token_uri: format!("{}", "http://example.com/token")
})

Warp Reply实现

impl Reply for ClientKey {
    fn into_response(self) -> Response {
        warp::reply::json(&self).into_response()
    }
}

解决方案

问题根源在于生成的pvt_key字符串末尾自带了一个换行符,序列化JSON时会被转义为\n。只需移除这个末尾的换行即可实现需求,以下两种方案任选:

方案1:手动移除末尾换行

在赋值private_key时,使用trim_end()方法去掉字符串末尾的所有空白字符(包括换行符):

Ok(ClientKey {
    kid,
    // 直接处理pvt_key(如果pvt_key本身是String类型)
    private_key: pvt_key.trim_end().to_string(),
    token_uri: "http://example.com/token".to_string()
})

如果pvt_key是通过format!生成的,也可以直接对结果调用trim_end():

private_key: format!("{}", pvt_key).trim_end().to_string(),

方案2:通过serde序列化自动处理

给ClientKey的private_key字段添加序列化属性,让serde在序列化时自动移除末尾空白:

use serde::{Serialize, Serializer};

// 定义自定义序列化函数,移除字符串末尾空白
fn trim_trailing_newline<S>(value: &str, serializer: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    serializer.serialize_str(value.trim_end())
}

#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClientKey {
    pub token_uri: String,
    pub kid: String,
    // 指定使用自定义序列化函数
    #[serde(serialize_with = "trim_trailing_newline")]
    pub private_key: String,
}

这种方式无需每次手动处理private_key,序列化时会自动完成末尾空白的移除。

修改后重新运行,返回的JSON中私钥末尾的多余转义换行就会消失,与期望输出一致。


内容的提问来源于stack exchange,提问作者Armani_bologne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:37:00