title: action交互
date: 2019/12/21 15:17:28
toc: true
action交互
https://www.cnblogs.com/dreamliner/archive/2009/05/30/1492434.html
ASP
- 设计web页面,动态内容使用特定的asp过程名
% func() %
替代,也称其为一个占位符。 - 在某个.c文件中定义与asp过程对应的C函数
- 使用websAspDefine注册asp过程
函数原型
int AspProcName (int ejid, webs_t wp, int argc, chart_t **argv);
ejid参数作为JavaScript解释器句柄可以用来调用JavaScript相关函数,例如ejGetVar和ejSetResult。wp参数作为浏览器连接的句柄,可以用来调用很多有用的GoAhead服务器函数,例如用来输出HTML语句的websWrite等。argc和argv包含传递给asp过程的实参的个数和内容。
例子
清单1中的<% UpdateProcInfor(); %>
标签为例,此标签的目的是为了显示系统当前正在运行的进程的信息。
获取进程信息实际上是由位于ui.c中的UpdateProcInfo
函数完成的,详见清单2,它负责获取系统进程信息,并格式化为HTML输出。
清单3中的websAspDefine函数将<% UpdateProcInfor(); %>
标签与UpdateProcInfo
函数关联起来,这样当GoAhead解析home.asp页面遇到<% UpdateProcInfor(); %>
标签时,控制权就会跳转到UpdateProcInfor()函数,在输出以HTML格式表示的进程信息后,控制权转交给GoAhead继续解析home.asp页面。
//清单1:home.asp(省略了其它无关的部分,细节请参考附带源代码)
<html>
<head>
<% WriteMetaElement(); %>
</head>
…
<form action="/goform/UpdateConfig" method="post">
<input type="text" name="interval" value="" size="7" />
<input type="submit" name="ok" value="Update" />
<input type="reset" name="cancel" value="Reset" />
</form>
<% UpdateProcInfo(); %>
</html>
//清单2:ui.c
#include "ui.h"
#include "..webs.h"
//以HTML格式输出系统当前进程信息
int UpdateProcInfo(int ejid, webs_t wp, int argc, char_t *argv)
{
return WriteProcPage(wp);
}
//根据用户输入改变刷新间隔时间设置
void UpdateConfig(webs_t wp, char_t *path, char_t *query)
{
int tmpInterval=atoi(websGetVar(wp, "interval", "-1"));
if(tmpInterval>3)
{
s_interval=tmpInterval;
}
websRedirect(wp, L"home.asp");
}
//清单3:main.c文件中的initWebs()函数
#include "ui.h"
//关联asp标签和C函数名字
websAspDefine(T("UpdateProcInfo"), UpdateProcInfo);
websAspDefine(T("WriteMetaElement"), WriteMetaElement);
//关联GoForms标签和C函数名字
websFormDefine(T("UpdateConfig"), UpdateConfig);
goaction
GoAction绑定到以/ action /开头的URI 。当客户端请求URI / action / NAME时,将调用操作处理程序,然后该操作处理程序将通过NAME查找GoAction定义并注册好后GoAction函数,就可以通过浏览器ip:port/action/exampleAction访问这个action
这个和asp的过程有点区别的,asp的是页面里面有asp过程,去调用asp过程
websDefineAction(“ buy”,buy);
jst的绑定是这样的
websDefineJst(“ outputTable”,outputMyTable);
其实,我理解的是form也是一个action,因为submit也是提交到一个指定/goform/xxx
的网址执行函数xxx
这个和action是一样的可以看到源码 证实了这一点,也就是form是action实现的
#define websFormDefine websDefineAction
应该是新版用websDefineAction
替换了websFormDefine
,在官网的api已经没有websFormDefine
了
https://www.embedthis.com/goahead/doc/ref/api/goahead.html#group___webs_1ga16df3436fa7bff9179b1d278c24beef5
FORM交互
注意 新版使用action 在route.txt中使用uri=/action/
GoAhead实现了称为GoForms的标准的通用网关接口(CGI)处理用户提交的表单。与传统的CGI方法不同,GoForms过程不是为每个浏览器连接都创建一个新的进程,而是通过与GoAhead服务器共享地址空间,于是可以直接访问全部的请求上下文。GoForms处理器可以自动解析和访问所有的POST和查询数据,它也提供了一组API可以轻松访问CGI变量。
GoForms过程与ASP过程不同,它主要用来响应用户输入以更新系统设置或者执行特定的动作。在GoAhead中,GoForms实现为一个URL处理器,它会解释以"/goform"
开始的URLs
。紧跟着"goform"之后的字符串定义了表单名字和用户请求的细节。例如:“/goform/ UpdateConfig?interval=5”这个请求表示调用GoForms过程" UpdateConfig ",GoForms变量interval表示用户设置的新刷新间隔时间。GoAhead对ASP过程和GoForms过程的处理十分类似,只是GoForms过程通过websFormDefine函数调用进行关联,并且必须遵守原型void GoFormsProcName(webs_t wp, char_t *path, char_t *query);
。完整的GoForms过程示例请参考列表1-3中的用来处理用户请求的UpdateConfig过程。
源码的句柄设置
initWebs()中定义:
websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);//这里设置form方式调用时候的文件位置
C代码的注册
websFormDefine
C代码的实现原型
void GoFormsProcName(webs_t wp, char_t *path, char_t *query)
web的调用方式1
var objAction = "/goform/fun_me?account="+account+"&password="+password;
web调用的方式2 使用submit
<form action="/goform/fun_me" method="post">
<input type="submit" name="ok" value="Update" />
</form>
websFormDefine(T("fun_me"), fun_me);
数据传递
webs到客户端的数据基本通过websWrite写字符串的方式来通讯
websGetVar(wp, T("sql"), T("")); //得到webs变量
websWrite();//把字符串发送到浏览器 可以直接在网页调用的<% xxx() %> 的xxx直接输出
websDone(wp, 200);//用于form方式的调用
goahead将前端数据存在哪一个buf
goahead如何处理前端发过来的字符串。
网上的教程都是使用websGetVar对表单数据进行读取。
goahead将表单数据存放在wp->var这个hash表中,而对于json没有进行处理。
根据这个函数能够找到在http.c中,有一个websSetFormVars()它将wp->input的数据存在Var中。
goahead如何接受json字符串:
websSetStatus(wp,200);
websWriteHeaders(wp,-1,0);
websWriterHeader(wp,"Content-Type","application/text");
char*jsonString=wp->input.servp;
然后使用jsonc或者jsonrpc进行解析