아래 영상에 감명을 받아서,…
// .razor.cs
[Parameter]
[SupplyParameterFromQuery]
public string? Data { get; set; }
[Inject]
public NavigationManager NavMan { get; set; } = null!;
[Inject]
public IJSRuntime JS { get; set; } = null!;
private DataDto _dto = new();
protected override void OnParametersSet()
{
if(Data != null)
{
_dto = DataDto.FromJson64(Data);
}
}
private async Task OnSaveClickedAsync()
{
var url = NavMan.GetUriWithQueryParameter(nameof(Data), _dto.ToJson64());
await JS.InvokeVoidAsync("navigator.clipboard.writeText", url);
await JS.InvokeVoidAsync("alert", "데이터가 복사되었습니다.");
NavMan.NavigateTo(url);
}
class DataDto
{
// properties..
public static DataDto? FromJson64(string json64)
{
var bytes = Convert.FromBase64String(json64);
var utf8String = Encoding.UTF8.GetString(bytes);
var dto = JsonSerializer.Deserialize<DataDto>(utf8String);
return dto;
}
public string ToJson64()
{
var jsonString = JsonSerializer.Serialize(this);
var bytes = Encoding.UTF8.GetBytes(jsonString);
var json64 = Convert.ToBase64String(bytes);
return json64;
}
}
근데, DataDto 에 배열이 들어가니, URL이 몇 천자가 쉽게 넘어갑니다.
영상과는 다르게, 414 (URL 너무 김) 에러가 납니다.
진정한 남자는 여기에서 멈추지 않고, 압축해서 구겨 넣어 봅니다.
static class Ziper
{
public static void CopyTo(Stream src, Stream dest)
{
byte[] bytes = new byte[4096];
int cnt;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
{
dest.Write(bytes, 0, cnt);
}
}
public static byte[] Zip(string str)
{
var utf8Bytes = Encoding.UTF8.GetBytes(str);
using var inStream = new MemoryStream(utf8Bytes);
using var outStream = new MemoryStream();
using (var gs = new GZipStream(outStream, CompressionMode.Compress))
{
CopyTo(inStream, gs);
}
return outStream.ToArray();
}
public static string Unzip(byte[] bytes)
{
using var inStream = new MemoryStream(bytes);
using var outStream = new MemoryStream();
using (var gs = new GZipStream(inStream, CompressionMode.Decompress))
{
CopyTo(gs, outStream);
}
return Encoding.UTF8.GetString(outStream.ToArray());
}
}
DataDto 도 바꿔줍니다.
class DataDto
{
// properties..
public static DataDto? FromJson64(string json64)
{
var bytes = Convert.FromBase64String(json64);
//var utf8String = Encoding.UTF8.GetString(bytes);
var utf8String = Ziper.Unzip(bytes);
var dto = JsonSerializer.Deserialize<DataDto>(utf8String);
return dto;
}
public string ToJson64()
{
var jsonString = JsonSerializer.Serialize(this);
// var bytes = Encoding.UTF8.GetBytes(jsonString));
var bytes = Ziper.Zip(jsonString);
var json64 = Convert.ToBase64String(bytes);
return json64;
}
}
이제 URL이 반 이하로 줄어 414에러가 없어집니다… 는 뻥이고, Json 문자열을 줄이기 위해, 온갖 뻘짓을 하고 난 후에야 에러가 없어졌습니다.
로컬 저장소 또는 DB에 저장하는 하남자로 돌아 왔습니다.