如何在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
相关产品推荐
相关产品推荐

