C# 前后台Base64加解密-关于HTML在POST接口JSON型参数中无法传递的思考

一、问题背景

    近期在做微信招聘公众号的开发工作,使用.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邮箱。

猜你喜欢

转载自blog.csdn.net/qq_23009105/article/details/80884338