题记:用“易语言.飞扬”(EF)开发WEB应用程序,此前还没有先例。但因为EF本地开发包(EFNDK)已经发布,用C/C++开发一个EF类库,使其支持EF开发WEB应用程序,应该并非难事。当然也可想而知,其中必有诸多难点有待解决。此系列文章,为本人探索过程之记录,对外人未必有多大价值。如有网友乐观其事,还请理性待之。作者:liigo。转载请务必注明出处:http://blog.csdn.net/liigo/。在线留言。
试用EF开发WEB应用程序(5): URL编码和URL解码
之前的文章提到,Query String是URL的一部分,那么其内容应当遵守URL的语法规则,例如不能出现 ; / ? = & 等特定字符,也不应该包含汉字字符。通常,在需要组合生成一个URL时,需要对Query String中的内容(尤其是value部分)进行“URL编码”,以确保得到一个合法的URL;在处理一个URL请求时,需要对Query String进行“URL解码”,以便还原到“URL编码”之前的Query String。CGI / FastCGI 程序在处理HTTP请求时,其从环境变量 QUERY_STRING 中获取的内容,即为已经过“URL编码”的Query String。
以之前文章中出现的URL “http://localhost:8080/querystring.efcgi?x=abc&y=ef&z=%E4%B8%AD%E5%9B%BD” 为例,其中“%E4%B8%AD%E5%9B%BD” 部分就是“URL编码”后的结果,经过“URL解码”之后,是汉字“中国”二字。
考虑到“URL编码”和“URL解码”是常见操作,EF类库 fastcgi.efn 中提供了这两项功能,同时对环境变量 QUERY_STRING 中的内容自动进行“URL解码”。
在EF类库 fastcgi.efn 中,实现“URL编码”的C++代码如下:
EFChar*URLEncode(EFChar*url,EF_MiniMem&buffer)
{
EFCharc;
EFCharhexOutputBuffer[2];
EF_MiniMemmem;
intn=EF_strlen(url);
buffer.Alloc(n<<1);
buffer.Empty();
for(inti=0;i<n;i++)
{
c=url[i];
if((c>='a'&&c<='z')||(c>='0'&&c<='9')||(c>='A'&&c<='Z')
||(strchr("-_.",c)!=NULL))
{
buffer.AddChar(c);
}
elseif(c=='')
{
buffer.AddChar(myC('+'));
}
else
{
if(c<=255)
{
_URLEncode_addEncodeChar((unsignedchar)c,buffer,hexOutputBuffer);
}
else
{
constchar*utf8=(constchar*)EF_UCS_to_UTF8(&c,1,mem);
intlen=strlen(utf8);
for(intj=0;j<len;j++)
{
_URLEncode_addEncodeChar(utf8[j],buffer,hexOutputBuffer);
}
}
}
}
buffer.AddChar(myC('
在EF中,调用 FCGI.URLEncode() 即可进行“URL编码”工作。
在EF类库 fastcgi.efn 中,实现“URL解码”的C++代码如下:
EFChar*URLDecode(EFChar*url,EF_MiniMem&buffer)
{
EFCharc,*pc;
unsignedcharutf8[3];
EF_MiniMemmem;
intn=EF_strlen(url);
buffer.Alloc(n);
buffer.Empty();
for(inti=0;i<n;i++)
{
c=url[i];
if(c!=myC('%'))
{
buffer.AddChar((c==myC('+')?myC(''):c));
continue;
}
utf8[0]=fromhex(&url[i+1]);
if((utf8[0]&0x80)==0)//0xxxxxxx
{
buffer.AddChar((EFChar)utf8[0]);
i+=2;
}
elseif((utf8[0]>>5)==6)//110xxxxx
{
if(n-i>=6&&url[i+3]==myC('%'))
{
utf8[1]=fromhex(&url[i+4]);ASSERT(utf8[1]>>6==2);//10xxxxxx
pc=EF_UTF8_to_UCS((char*)utf8,2,mem);
ASSERT(pc&&EF_strlen(pc)==1);
if(pc==NULL)returnNULL;
buffer.AddChar(*pc);
i+=5;
}
elsereturnNULL;
}
elseif((utf8[0]>>4)==0x0E)//1110xxxx
{
if(n-i>=9&&url[i+3]==myC('%')&&url[i+6]==myC('%'))
{
utf8[1]=fromhex(&url[i+4]);ASSERT(utf8[1]>>6==2);//10xxxxxx
utf8[2]=fromhex(&url[i+7]);ASSERT(utf8[2]>>6==2);//10xxxxxx
pc=EF_UTF8_to_UCS((char*)utf8,3,mem);
ASSERT(pc&&EF_strlen(pc)==1);
if(pc==NULL)returnNULL;
buffer.AddChar(*pc);
i+=8;
}
elsereturnNULL;
}
else
returnNULL;
}
buffer.AddChar(myC('
在EF中,调用 FCGI.URLDecode() 即可进行“URL解码”工作。
网络浏览器在处理用户提交的FORM数据时,也会自动将FORM中的数据生成经过“URL编码”的Query String。在实践中发现,如果FORM所属HTML文件的编码为UTF-8,则汉字是按其UTF-8编码数据进行“URL编码”;如果FORM所属HTML文件的编码未指定或为非UTF-8编码,则汉字可能不是按其UTF-8编码数据进行“URL编码”。本文上面所列代码,只能按UTF-8编码进行“URL编码”和“URL解码”,使用时需要注意。
如果代码有错误或疏忽、遗漏之处,请各位批评指正。
下文预告:解析Query String中的各参数值
分享到:
相关推荐
实验室和材料-Web应用程序开发 :warning: :warning: 考试信息(技巧和窍门) 使用脚手架或尝试重现自动创建部分(使用实体框架的带有视图的控制器) 对于数据表,您可以使用以下示例: 在REPO的解决方案领域中...
1、基于.netCore 6 +EF 实现webApi增删查改基础应用,开箱即用 2、已解决webapi跨域问题 3、直接替换数据库链接即可使用
【ASP.Net Core Web应用程序】 创建数据库
源码说明: MVC 音乐店是用来介绍和展示使用 ASP.NETMVC 以及 Visual Studio 进行 Web 开发的示例应用程序,我们将从基础知识开始,一步一步地进行介绍,因此,初学者也可以去的很好的学习体验。 这个示例程序使用 ...
该项目包含与Web服务和数据层应用程序进行通信的Web窗体,MVC5和Core Web应用程序。专案土狼ASP.NET Core / Identity Web应用程序,用于测试Puma Scan规则引擎。狸ASP.NET 4.6 MVC 5 / Identity Web应用程序,用于...
Silverlight 5:OA里组织图OrgChart拖拽操作 封装Context:封装ConfigContext,CacheContext,UserContext,CookieContext.. 上传控件:Uploadify使用实例 Jquery:除Metronic模板在Assets文件夹,Content文件夹加入...
CollegeApp 设置: 具有 EntityFramework 6 和代码优先开发的 ASP.NET MVC5 Web 应用程序; 数据库服务器 2014 引导程序 3.0
ASP.NET Boilerplate AppVeyor:什么是...ASP.NET Boilerplate可与最新的ASP.NET Core和EF Core一起使用,但也支持ASP.NET MVC 5.x和EF6.x。 模块化设计ABP设计为模块化和可扩展的,可提供构建您自己的模型的基础架构
由EFCore配合WebApi搭建的简单框架,通过Ajax实现增删改查,显示部分用了AngularJS。压缩包中包含源码、数据库、搭建流程。
该博客后端api基于.net5和efcore构建,使用webApi进行接口的开发和管理。主要包含以下功能: 用户管理:包括用户注册、登录、修改密码等功能。 文章管理:包括文章的增删改查、文章分类管理、文章标签管理等功能。 ...
ABP Framework是一个基于ASP.NET Core的完整基础结构,可以通过遵循软件开发最佳实践和最新技术来创建现代Web应用程序和API 。 入门 是使用ABP框架启动新Web应用程序的最简单方法。 是开发完整堆栈Web应用程序的...
与ASP相比ASP.NET在Web应用开发上无疑更容易,更有效率。Web开发大部分还是围绕着数据操作,建立数据库存储数据,编写代码访问和修改数据,设计界面采集和呈现数据。走过Asp.net学习入门阶段后,真正开始着手开发一...
如果小应用是网上的程序,则地址格式为网上的程序的完整URL 鱼鱼WEBIM接口是session("fishnum"),登录后通过session("fishnum")即可获取登录的鱼鱼号码 注意使用session("fishnum")这个鱼鱼WEBIM接口开发小应用时,...
.net core2.0 + Angular5 + WebAPI 实现增删改查的实例 执行压缩包里的query.sql创建数据库和表 需要的环境 1)VS2017 2).net core2.0 SDK 3)Node.js 9.0以上
该存储库包含两种不同的体系结构:Web api服务(ASP.NET Core Web api)以及单页应用程序(Angular 8)和传统MVC Web应用程序(ASP.NET Core MVC)。 注意:本指南将重点介绍SPA和api服务,并且正在开发更多功能。...
Ygloo-external-webp(WebP codec)是可以进行编码和解码 WebP 格式图像的开发包。包含了可在其他程序中使用的 WebP 支持以及命令行工具 'cwebp' 和 'dwebp'。 标签:Ygloo 分享 ...
ef开发框架
EfCore.GenericServices 该库可帮助您快速编写Web /移动/桌面应用程序的创建,读取,更新和删除(CRUD)访问的代码。 它充当Entity Framework Core(EF Core)访问的数据库与前端系统需求之间的适配器和命令模式。 ...
EF-FST减震.zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例EF-FST减震.zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例EF-FST减震.zip三菱PLC编程案例源码资料编程控制器应用通讯...
它采用分层架构进行管理,可使用最新的ASP.NET Core和Web API和EF Core技术构建现代Web应用程序。此存储库中包括什么我们已经在run-aspnetcore样板模板上实现了以下功能。 您可以根据业务需求更改实际功能。 电子...