一、问题背景
近期在做微信招聘公众号的开发工作,使用.Net Web项目作为后台、WebApi项目实现微信调用接口、js实现微信前端页面。所有接口都做完的时候,有一个需求是需要将微信前端页面的简历页面发送至HR邮箱,我们都知道邮箱内容是可以包含<HTML>标签并展示页面内容的,那么就需要在投递简历的接口中增加前端简历页面(即<HTML>标签中的内容),通过后台的邮件服务发送。
但是之前写好的POST接口Body使用JSON参数,<HTML>标签直接放到JSON参数中,无法Request。后来了解到<HTML>中的字符转义方式,JSON识别报错。所以,需要采取方法解决这个问题。
二、思路
1、把<html>内容放在params中?
当前项目背景下,<html>内容非常长,直接拼接在POST接口参数中,非常不妥。
2、把<html>内容放在body实体中?
当前接口使用application/json型的实体,<html>直接放进来无法识别无法请求。
3、把<html>内容加密成其他格式再放到实体中?
前端加密、后台解密,工作量不多,所以采取了加解密的方式。
三、Base64加解密
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。当前项目背景下我们采用Base64加解密的方式,通过前端Base64加密、后台Base64解密,接收<html>标签类的参数。因为Windows和Linux环境下默认编码不同,要使你的程序在不同平台下得到相同编码,必然要指定编码格式。
1、前端Base64加密。当前项目前端js页面内容本来就是UTF-8格式,所以我直接引用js库来实现Base64加密。链接如下:
https://www.npmjs.com/package/js-base64
2、后台Base64解密。C#实现Base64加解密很简单,直接引用System.Text.dll。里面有封装好的字节数组和Base64字符串的转换方法Convert.FromBase64String()、Convert.ToBase64String()。上面我们说到Base64加密之后的密文为了保证在不同系统中通用,最好指明加密字符格式。在将原文字符串加密之前,可以按照指定的格式转换为字节数组,同样适用System.Text.dll中封装的方法。
例如:
Encoding encode = Encoding.UTF8;//类库中Encoding主要包含Default、ASCII、BigEndianUnicode、Unicode、UTF32、UTF7、UTF8等格式 byte[] bytes = encode.GetBytes(string);
加解密源代码如下:
using System.Text; ///<summary> ///微信帮助类 ///</summary> public class WXHelper { /// <summary> /// Base64加密,采用utf8编码方式加密 /// </summary> /// <param name="source">待加密的明文</param> /// <returns>加密后的字符串</returns> public static string EncodeBase64(string source) { return EncodeBase64(Encoding.UTF8, source); } /// <summary> /// Base64加密 /// </summary> /// <param name="codeName">加密采用的编码方式</param> /// <param name="source">待加密的明文</param> /// <returns></returns> public static string EncodeBase64(Encoding encode, string source) { string enString = ""; byte[] bytes = encode.GetBytes(source); try { enString = Convert.ToBase64String(bytes); } catch { enString = source; } return enString; } /// <summary> /// Base64解密 /// </summary> /// <param name="codeName">解密采用的编码方式,注意和加密时采用的方式一致</param> /// <param name="result">待解密的密文</param> /// <returns>解密后的字符串</returns> public static string DecodeBase64(Encoding encode, string result) { string decode = ""; byte[] bytes = Convert.FromBase64String(result); try { decode = encode.GetString(bytes); } catch { decode = result; } return decode; } /// <summary> /// Base64解密,采用utf8编码方式解密 /// </summary> /// <param name="result">待解密的密文</param> /// <returns>解密后的字符串</returns> public static string DecodeBase64(string result) { return DecodeBase64(Encoding.UTF8, result); } }
四、问题解决
通过上述思路,在原有接口基础上,添加了一个参数,加了两行加解密代码,成功实现了<html>标签内容的发送接收,并最终通过后台发送到HR邮箱。