﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<! --Include:Include\LoadHeader[,前后端一体 WEB 视图框架 AJAX 调用函数]-->
<body>
    <p>
        AJAX 调用函数输出 JSON 数据，用于前端界面交互或者类 WEB API 接口调用。 
    </p>
    <p>
        1.  建议在项目中建立一个名为 Ajax 的目录，然后将所有 AJAX 调用函数应用项目放在这个目录下。 
        <br />因为 AutoCSer 默认 Ajax 调用 class 的命名空间的前缀为 <b>项目名称. Ajax.</b>，便于统一管理与维护 AJAX 调用函数，避免与其它 WEB 应用项混淆。 
    </p>
    <p>
        2.  在 Ajax 目录中添加继承自 <b>AutoCSer. WebView. Ajax</b> 的 class，并且申明为 AJAX 调用函数容器 <b>[AutoCSer. WebView. Ajax]</b>，支持<a href="/Config/Index.html">全局默认配置</a>。 
        <br />也可以添加继承自基于对象池支持实现 <b>AutoCSer. WebView. Ajax&lt;ajaxType&gt;</b> 的 class，ajaxType 用于标识当前类型。 
    </p>
    <p>
        3.  根据需求在 class 中添加 public 实例方法（注意不要添加名称相同的重载方法），项目编译后将生成这些方法的 服务端 / js / ts 调用代理。 
    </p>
    <p>
        假设 API 的调用名称为 Get. Add，在 AutoCSer 客户端脚本这样调用（当 IsOnlyPost = false 时，也可以使用 AutoCSer. HttpRequest. AjaxGet 函数）
        <div name="ace" mode="javascript">
            <pre>AutoCSer. HttpRequest. Ajax(new AutoCSer. HttpRequestQuery('Get. Add', { left: 1, right: 2 }, function(Value) { console.log(Value. Return); }));</pre>
        </div>
        如果设置 IsExportTypeScript = true，也可以调用使用生成的 API（就是对上面代码的包装）
        <div name="ace" mode="javascript">
            <pre>AutoCSerAPI.Ajax. Get. Add(1, 2, function(Value) { console.log(Value. Return); });</pre>
        </div>
        <! --Include:Include\GetCode[Example,0,,WebView\Ajax\RefOut.cs]-->
        <! --Include:Include\GetCode[Example,1,,WebView\ViewJs\Api.ts]-->
        <! --Include:Include\GetCode[Example,2,,WebView\Include\AjaxReturnSkin.ts]-->
    </p>
    <p>
        .  为了防止 WEB 跨域攻击，默认检测 Referer 域名匹配，并且只支持 POST 调用，输入参数解析支持 JSON / XML 两种数据。 
        <br />为了支持浏览器以外的应用程序访问，支持 FORM / POST + JSON / XML 的任意组合，一共 4 种访问模式。 
        <br />单纯的 POST 模式必须指定 Content-Type，用与区分 JSON / XML 输入数据。 
        <br />FORM 模式，使用 name 区分 JSON / XML 输入数据，<b>j</b> 表示 JSON，<b>x</b> 表示 XML。 
        <! --Include:Include\GetCode[Example,3,,WebView\Ajax\Post.cs]-->
    </p>
    <p>
        .  对于非 WEB 调用 API，可以支持 GET 请求，可以忽略 Referer 域名匹配检测，支持 3 种访问模式。 
        <br />单纯的 Query 只支持 bool / byte / sbyte / ushort / short / uint / int / long / ulong / float / double / decimal / string / enum / DateTime / Guid 这些基础的数据类型解析，其它类型数据将自动当作 JSON 字符串来解析。 
        <br />Query 模式，使用 name 区分 JSON / XML 输入数据，<b>j</b> 表示 JSON，<b>x</b> 表示 XML。 
        <! --Include:Include\GetCode[Example,4,,WebView\Ajax\Get.cs]-->
    </p>
    <p>
        .  同步 API 支持 ref / out 参数。 
        <! --Include:Include\GetCode[Example,5,,WebView\Ajax\RefOut.cs]-->
    </p>
    <p>
        .  支持异步 API，返回值类型必须为 void，不支持 ref / out 参数，最后一个参数类型必须是委托 <b>Action&lt;AutoCSer. Net. TcpServer. ReturnValue&lt;returnType&gt;&gt;</b>，服务端必须保证该回调委托被执行。 
        <! --Include:Include\GetCode[Example,6,,WebView\Ajax\Asynchronous.cs]-->
    </p>
    <p>
        .  对于只有一个输入或者一个输出参数的情况下，支持 <b>[AutoCSer. Emit. BoxSerialize]</b> 序列化的拆包，直接操作该参数。 
        <! --Include:Include\GetCode[Example,7,,WebView\Ajax\BoxSerialize.cs]-->
    </p>
    <p>
        .  由于 API 默认调用名称为 <b>类型名称. 函数名称</b>，当函数需要重载时会产生调用冲突，可以自定义调用名称。 
        <! --Include:Include\GetCode[Example,8,,WebView\Ajax\Name.cs]-->
    </p>
</body>
</html>