文章目录
前言
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
短链接的优点:
1、短
通过短链接功能用简短的网址替代原来冗长的网址,缩短了短信长度,降低成本。短信是按照内容的长短来收费的,短一点的链接既美观也省钱。
2、强大的数据功能
在短信中置入短链接,可以对短信的点击效果进行统计分析,进而能够判定短信发送的效果如何,为会员运营及精细化管理提供辅助依据。
3、提高购买率
短信中带上短链接,用户可以直接点击到达相应的页面,操作比较方便,更有利于顾客进行购买。
短链接服务的实现原理如下:
1、用户访问短链接,请求到达服务器;
2、服务器将短链接转换成为长链接,然后给浏览器返回重定向的状态码302;
3、浏览器拿到重定向的状态码,以及真正需要访问的地址,重定向到真正的长链接上。
一、ID加密成字符串
1.自定义序列化
在输出时,我们需要自动加密Id。
在这里,通过编写一个自定义JsonConverter来实现:
public class HashIdJsonConverter : JsonConverter<int>
{
Hashids hashids = new Hashids("愚公公众号");//加盐
public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var str = JsonSerializer.Deserialize<string>(ref reader, options);
return hashids.Decode(str)[0];
}
public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
{
JsonSerializer.Serialize(writer, hashids.Encode(value), options);
}
}
运行
public class UserDto
{
[JsonConverter(typeof(HashIdJsonConverter))]
public int Id { get; set; }
public string Name { get; set; }
}
[HttpGet]
public IEnumerable<UserDto> Get()
{
return new[] { new UserDto { Id = 12345, Name = "用户12345" } };
}
2.自定义模型绑定
编写一个自定义IModelBinder来实现:
public class HashIdModelBinder : IModelBinder
{
Hashids hashids = new Hashids("公众号My IO");//加盐
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var modelName = bindingContext.ModelName;
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
var str = valueProviderResult.FirstValue;
bindingContext.Result = ModelBindingResult.Success(hashids.Decode(str)[0]);
return Task.CompletedTask;
}
}
运行
[HttpGet("{id}")]
public UserDto Get([ModelBinder(typeof(HashIdModelBinder))]int id)
{
return new UserDto { Id = id, Name = "用户"+id } ;
}
二、短链接服务
Web API实现生成短链接接口:
[HttpPost("shorten")]
public string ShortenUrl([FromBody]string url)
{
var id = db.Insert(url);
var hashids = new Hashids("愚公公众号", minHashLength: 6);
return hashids.Encode(id);
}
短链接跳转接口:
[HttpGet("{shortUrl}")]
public IActionResult GetUrl(string shortUrl)
{
var hashids = new Hashids("公众号My IO", minHashLength: 6);
var id = hashids.Decode(shortUrl)[0];
var urlData = db.Get(id);
return Redirect(urlData.Url);
}
实现思维:将短链接解码成数据Id,然后到数据库查到对应长链接。最后返回跳转状态码。