精华内容
下载资源
问答
  • Tyk创建Api

    千次阅读 2017-09-06 09:51:59
    Api管理 1、创建Api 1.1、添加一个api Api信息填写 身份验证支持多种验证方式,可选择。 点击保存api。 示例:Api添加成功之后,返回Api主面板。 2、获取所有api ...

    Api管理

    1、创建Api

    1.1、添加一个api


    Api信息填写

    身份验证支持多种验证方式,可选择。


    点击保存api。

    示例:Api添加成功之后,返回Api主面板。


    2、获取所有api

    http://xxx.xxx.xxx.xxx:3000/api/apis/增加Head校验:头部校验格式为:此处的value实际为你管理员账户的秘钥(可在Dasnboard面板中点击User菜单,然后查看管理员的秘钥)如下:


    然后进行访问。


    3、接口创建Api

    3.1获取管理员账户秘钥:

    比如:erccc2ebbbbbbb4fe9cccceb2d9147

    3.2请求数据(postman 或者curl)

    1、curl

      curl -H "Authorization:erccc2ebbbbbbb4fe9cccceb2d9147" \

         -s \

         -H "Content-Type:application/json" \

         -X POST \

         -d '{

            "api_definition": {

                "name": "TestAPI",

                "slug":"test-api",

                "auth": {

                    "auth_header_name":"Authorization"

                },

                "definition": {

                    "location":"header",

                    "key":"x-api-version"

                },

                "version_data": {

                    "not_versioned":true,

                    "versions": {

                        "Default": {

                            "name":"Default",

                           "use_extended_paths": true

                        }

                    }

                },

                "proxy": {

                    "listen_path":"/test-api/",

                    "target_url":"http://httpbin.org/",

                    "strip_listen_path":true

                },

                "active": true

            }

         }' https://localhost:3000/api/apis/ |python -mjson.tool

    2、Postman:

    Post的数据与curl的数据相同。

    注意("name":"Test API","slug": "test-api",)此处是您自己的api名称,"listen_path":"/test-api/","target_url": "http://httpbin.org/",为监听地址和目标地址。(此处的监听地址你设置 成什么后面的就是什么)

    返回信息:

    {

        "Status": "OK",

        "Message": "APIcreated",

        "Meta":"598a6839c9dfa805ab54a405"

    }

    请求成功

    3、管理面板验证:在管理面板中出现api03的api项目。

    4、访问创建的APi

    默认APi是使用Authorization进行认证的。


    请求http://xxx.xxx.xxx.xxx:8080/test-api/,注意加上Head,然后去访问就可以了

    展开全文
  • WebAPI学习(一)——创建Web API程序

    万次阅读 热门讨论 2016-03-13 14:59:50
    在公司中用到的都是webAPI的应用程序,这个东西之前没有接触过。但是这个并不是什么新鲜的东西,因我们 之前有mvc的基础,所以说学习这个东西还是比较容易的,在开始的时候自己可能突然蒙圈了。因为在人家项目中用 ...


       引言


       在公司中用到的都是webAPI的应用程序,这个东西之前没有接触过。但是这个并不是什么新鲜的东西,因我们


    之前有mvc的基础,所以说学习这个东西还是比较容易的,在开始的时候自己可能突然蒙圈了。因为在人家项目中用


    到的东西自己之前都没有接触过,感觉非常的陌生甚至整个混乱了。但是当我们静下心来好好想想的话是非常容易


    的,就是在某些写法上不太一样,其余的都差不多,下面就给大家创建第一个程序。


      创建一个Web API程序


       启动VS2012创建一个新项目,在已经安装的模板中选择 ASP.NET MVC4 Web API程序


     


       在ASP.NET MVC项目对话框中选择Web API项,点击确定 


           


       创建成功之后工程中会自动添加一个Web API服务控制器,上面并附带访问地址 


        


       项目解决方案,选择Models文件夹右键 添加一个Model类 



     



       代码如下: 


    namespace Git.Framework.WebAPI.Models
    {
        public class Contact
        {
            public int ID { getset; }

            public string Name { getset; }

            public string Sex { getset; }

            public DateTime Birthday { getset; }

            public int Age { getset; }
        } }

     

     工程解决方案选择Controllers文件夹右键添加一个新的Web API controller

     

     在添加控制器弹出对话框中选择模板: 空API控制器

           


       控制器中添加如下代码: 


    namespace Git.Framework.WebAPI.Controllers
    {
        public class ContactController : ApiController
        {
            Contact[] contacts = new Contact[] 
            { 
                new Contact(){ ID=1, Age=23, Birthday=Convert.ToDateTime("1977-05-30"), Name="情缘", Sex=""},
                new Contact(){ ID=2, Age=55, Birthday=Convert.ToDateTime("1937-05-30"), Name="令狐冲", Sex=""},
                new Contact(){ ID=3, Age=12, Birthday=Convert.ToDateTime("1987-05-30"), Name="郭靖", Sex=""},
                new Contact(){ ID=4, Age=18, Birthday=Convert.ToDateTime("1997-05-30"), Name="黄蓉", Sex=""},
            };

            /// <summary>
            
    /// /api/Contact
            
    /// </summary>
            
    /// <returns></returns>
            public IEnumerable<Contact> GetListAll()
            {
                return contacts;
            }

            /// <summary>
            
    /// /api/Contact/id
            
    /// </summary>
            
    /// <param name="id"></param>
            
    /// <returns></returns>
            public Contact GetContactByID(int id)
            {
                Contact contact = contacts.FirstOrDefault<Contact>(item=>item.ID==id);
                if (contact == null)
                {
                    throw new HttpResponseException(HttpStatusCode.NotFound);
                }
                return contact;
            }

            /// <summary>
            
    /// 根据性别查询
            
    /// /api/Contact?sex=女
            
    /// </summary>
            
    /// <param name="sex"></param>
            
    /// <returns></returns>
            public IEnumerable<Contact> GetListBySex(string sex)
            {
                return contacts.Where(item => item.Sex == sex);
            }
        }}

     

     浏览器访问API路径


    Controller Methed

    URI

    GetListAll

    /api/Contact

    GetListBySex

    "/api/Contact?sex=" + sex

    GetContactByID

    /api/Contact/"+id

     

       在IE浏览器中浏览出现如下效果


        


       如果在Chrome 或者 FireFox 中浏览会先下如下效果


     

     

     

     Javascript访问Web API


     在项目中添加一个About View视图


       


      代码如下:


    <span style="font-family:SimSun;font-size:18px;">@{
        Layout = null;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>About</title>
        <script type="text/javascript" src="/Scripts/jquery-1.7.1.min.js"></script>
        <script type="text/ecmascript">
            $(document).ready(function () {
                $("#btnAll").click(function () {
                    $.getJSON("/api/Contact", function (data) {
                        var html = "<ul>";
                        $(data).each(function (i, item) {
                            html += "<li>"+item.ID+":"+item.Name+":"+item.Sex+"</li>";
                        });
                        html += "</ul>";
                        $("#contactAll").html(html);
                    });
                });
    
    
                $("#btnID").click(function () {
                    var id = $("#txtID").val();
                    $.getJSON("/api/Contact/"+id, function (data) {
                        var html = "<ul>";
                        $(data).each(function (i, item) {
                            html += "<li>" + item.ID + ":" + item.Name + ":" + item.Sex + "</li>";
                        });
                        html += "</ul>";
                        $("#contactID").html(html);
                    });
                });
    
                $("#btnSex").click(function () {
                    var sex = $("#ddlSex").val();
                    $.getJSON("/api/Contact?sex=" + sex, function (data) {
                        var html = "<ul>";
                        $(data).each(function (i, item) {
                            html += "<li>" + item.ID + ":" + item.Name + ":" + item.Sex + "</li>";
                        });
                        html += "</ul>";
                        $("#contactSex").html(html);
                    });
                });
            });
        </script>
    </head>
    <body>
        <p>
            <input type="button" id="btnAll" value="查询所有" /> 
        </p>
        <p>
            <input type="text"  id="txtID" name="txtID"/>
            <input type="button" id="btnID" value="根据ID查询" /> 
        </p>
        <p>
            <select id="ddlSex" name="ddlSex">
                <option value="男">男</option>
                <option value="女">女</option>
            </select>
            <input type="button" id="btnSex" value="根据性别查询" /> 
        </p>
        <div id="contactAll">
        </div>
        <div id="contactID">
        </div>
        <div id="contactSex">
        </div>
    </body>
    
    </html></span>


     

       运行结果效果图


        


      Web API总结


        1.Web API 控制器(Controller) 继承ApiController


        2. Api 的 Url Map: api/{controller}/{id} 每个"Action"是通过 Http谓词(GET/POST/PUT/DELETE)映射的


       3.客户端可以通过 Http Header 的 Accept 指定返回数据的格式。默认是支持:appliction/xml 和


     application/json,当想返回比如 image/jpeg 这样的图片格式时,需要添加 MediaTypeFormatter 。比如:当


    指定某个 Task 时,通过指定 Accept : image/jpeg 获取该 Task 的图片信息。

        



    展开全文
  • Spring boot : 快速创建RESTful API

    千次阅读 2020-02-16 17:03:07
    泛素最近在学前端的东西,想写个数据化平台的小项目,需要后端提供数据,正好前一阵子看了Kotlin的书,发现Kotlin相较java而而言简化了不少,作为练习这里使用Spring boot和Kotlin写一个关于员工的RESTful API实现...

    泛素最近在学前端的东西,想写个数据化平台的小项目,需要后端提供数据,正好前一阵子看了Kotlin的书,发现Kotlin相较java而而言简化了不少,作为练习这里使用Spring boot和Kotlin写一个关于员工的RESTful API实现简单的增删改查

    创建项目

    1、泛素这里使用的idea作为工具, 使用的java8
    在这里插入图片描述
    2、创建项目
    我使用的gradle构建项目
    在这里插入图片描述
    3、使用mysql作为数据持久化
    在这里插入图片描述
    4、设置项目路径
    在这里插入图片描述
    5、点击完成后gradle会自动通过你选择的spring 依赖进行安装

    在这里插入图片描述
    6、配置properties
    目录结构如下:
    在这里插入图片描述
    配置内容如下:

    spring.application.name=employee
    server.port=8888
    # 这里数据库我用了windows上mysql8自带的world数据库
    spring.datasource.url=jdbc:mysql://localhost:3306/world?serverTimezone=UTC&useSSL=false
    #这个用户名改成自己的
    spring.datasource.username=root
    #密码也是
    spring.datasource.password=ffzs
    # 这里注意 mysql8需要使用新的driver
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    
    spring.jpa.database=MYSQL
    spring.jpa.show-sql=true
    # Hibernate ddl auto (create, create-drop, update)
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
    

    到这里算是项目创建完成

    项目内容

    简单介绍一下springboot的几个逻辑层:

    1. model层:即数据库实体层,也被称为entity层,pojo层。
    2. Dao层:全称Data Access Object。Dao层比较底层,负责与数据库打交道具体到对某个表、某个实体的增删改查
    3. Service层:又叫服务层或业务层,会调用dao层和dto层,service层也会对数据进行一定的处理,比如条件判断和数据筛选等等。
    4. Controller层:负责前后端交互,接受前端请求,调用service层,接收service层返回的数据,最后返回具体的页面和数据到客户端。

    打个比方,Controller层像是运营,跟客户、销售沟通获取客户需求(前端请求),将产品需求交给产品经理(Service层),产品经理分析需求后将各种任务批发给不同员工(Dao层)

    1、model层

    为了方便演示,只设置了工号,姓名,性别,职务,权限几个字段。Kotlin不需要设置getter、setter,简单明了

    @Entity
    class Employee {
        @Id
        var id: Long = 0
        var name = ""
        var gender = ""
        var permission: Int = 0
        var position = ""
    }
    

    2、Dao层

    逻辑比较简单使用CrudRepository查询逻辑复杂的话建议实用JpaRepository

    interface EmployeeDao : CrudRepository<Employee, Long> {
        fun findByName(name: String): List<Employee>
    }
    

    3、controller层

    实现基于idCrud

    @RestController
    @RequestMapping("/users")
    class EmployeeController (val employeedao: EmployeeDao){
        @GetMapping
        fun findAll() = employeedao.findAll()
    
        @GetMapping("/{id}")
        fun findOne(@PathVariable id: Long) = employeedao.findById(id)
    
        @DeleteMapping("/{id}")
        fun deleteById(@PathVariable id: Long) = employeedao.deleteById(id)
    
        @PostMapping
        fun addOne(@RequestBody employee:Employee) = employeedao.save(employee)
    
        @PutMapping("/{id}")
        fun updateUser(@PathVariable id:Long, @RequestBody user:Employee) {
            assert(id == user.id)
            employeedao.save(user)
        }
    
        @GetMapping("/name/{name}")
        fun findByName(@PathVariable name:String) = employeedao.findByName(name)
    }
    

    4、添加测试数据

    @SpringBootApplication
    class EmployeeApplication {
        @Bean
        fun init (employeedao: EmployeeDao) = CommandLineRunner  {
            (1..10).forEach {
                val user = Employee()
                user.id = it.toLong()
                user.name = "用户" + it
                user.gender = if (it <= 5) "male"  else "female"
                user.position = "职务" + it
                user.permission = it * 10
                employeedao.save(user)
            }
        }
    }
    
    fun main(args: Array<String>) {
        runApplication<EmployeeApplication>(*args)
    }
    

    5、运行

      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.2.4.RELEASE)
    
    2020-02-16 16:23:19.725  INFO 18928 --- [           main] c.f.s.employee.EmployeeApplicationKt     : Starting EmployeeApplicationKt on ffzs with PID 18928 (H:\Projects\springProjects\employee\build\classes\kotlin\main started by dz in H:\Projects\springProjects\employee)
    2020-02-16 16:23:19.734  INFO 18928 --- [           main] c.f.s.employee.EmployeeApplicationKt     : No active profile set, falling back to default profiles: default
    2020-02-16 16:23:20.686  INFO 18928 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering 
    

    6、打开http://localhost:8888/users网页

    访问成功
    在这里插入图片描述

    功能测试

    1、测试get获取

    get请求直接用浏览器测试即可http://localhost:8888/users/1
    在这里插入图片描述
    测试http://localhost:8888/users/name/用户1
    在这里插入图片描述

    2、测试post添加

    post请求使用pythonrequests库测试:

    import requests
    import json
    
    user = {"id":11,"name":"ffzs","gender":"male","position":"职务1","permission":10}
    
    url = "http://localhost:8888/users"
    
    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    }
    
    res = requests.post(url, headers=headers, data=json.dumps(user))
    

    添加成功
    在这里插入图片描述

    3、测试put更改

    更改一下刚添加的用户名

    import requests
    import json
    
    user = {"id":11,"name":"泛泛之素","gender":"male","position":"职务1","permission":100000}
    
    url = f"http://localhost:8888/users/{user['id']}"
    
    headers = {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    }
    
    res = requests.put(url, headers=headers, data=json.dumps(user))
    

    更改成功:
    在这里插入图片描述

    4、测试delete删除

    将11号员工删除

    import requests
    requests.delete("http://localhost:8888/users/11")
    

    删除成功:
    在这里插入图片描述

    觉得有用点个赞!!!!!!!!!

    展开全文
  • 易语言api CreateProcess 创建进程

    千次阅读 2020-06-04 09:58:55
    WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件,我们先学习它的函数原型,参数和返回值。 函数原型 BOOL CreateProcess ( LPCTSTR lpApplicationName,//程序路径...

    封装进程创建的原因主要是易语言自带的运行和执行命令不能启动游戏,当我们写一键启动,批量启动游戏时,便用到了进程_创建的命令。

    用到的API CreateProcess

    WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件,我们先学习它的函数原型,参数和返回值。

    函数原型

    BOOL CreateProcess
    (
    LPCTSTR lpApplicationName,//程序路径可以是相对也可以是绝对路径
    LPTSTR lpCommandLine,//启动参数可空
    LPSECURITY_ATTRIBUTES lpProcessAttributes。//为空句柄不被继承
    LPSECURITY_ATTRIBUTES lpThreadAttributes,// 参数为空,新进程使用默认的安全描述符
    BOOL bInheritHandles,// TRUE表示允许当前进程中的所有句柄都由新建的子进程继承
    DWORD dwCreationFlags,// 指定附加的、用来控制优先类和进程的创建的标志。
    LPVOID lpEnvironment,// 指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
    LPCTSTR lpCurrentDirectory,// 这个字符串必须是一个包含驱动器名的绝对路径。
    LPSTARTUPINFO lpStartupInfo,// 指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
    LPPROCESS_INFORMATIONlpProcessInformation//指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
    );

    511遇见易语言模块API教程

    参数:

    lpApplicationName

    指向一个NULL结尾的、用来指定可执行模块的字符串。

    这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。

    这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine 参数最前面并由空格符与后面的字符分开。

    lpCommandLine

    指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。

    这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。

    如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。

    lpProcessAttributes

    指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。

    在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。

    lpThreadAttributes

    同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.

    bInheritHandles

    指示新进程是否从调用进程处继承了句柄。

    如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。

    dwCreationFlags

    指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。

    ⑴值:CREATE_DEFAULT_ERROR_MODE

    含义:新的进程不继承调用进程的错误模式。CreateProcess函数赋予新进程当前的默认错误模式作为替代。应用程序可以调用SetErrorMode函数设置当前的默认错误模式。

    这个标志对于那些运行在没有硬件错误环境下的多线程外壳程序是十分有用的。

    对于CreateProcess函数,默认的行为是为新进程继承调用者的错误模式。设置这个标志以改变默认的处理方式。

    ⑵值:CREATE_NEW_CONSOLE

    含义:新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用。

    ⑶值:CREATE_NEW_PROCESS_GROUP

    含义:新进程将是一个进程树的根进程。进程树中的全部进程都是根进程的子进程。新进程树的用户标识符与这个进程的标识符是相同的,由lpProcessInformation参数返回。进程树经常使用GenerateConsoleCtrlEvent函数允许发送CTRL+C或CTRL+BREAK信号到一组控制台进程。

    ⑷值:CREATE_SEPARATE_WOW_VDM

    如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;其他那些在不同VDM中运行的程序会继续正常的运行。同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。

    ⑸值:CREATE_SHARED_WOW_VDM

    如果WIN.INI中的Windows段的DefaultSeparateVDM选项被设置为真,这个标识使得CreateProcess函数越过这个选项并在共享的虚拟DOS机中运行新进程。

    ⑹值:CREATE_SUSPENDED

    含义:新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。

    ⑺值:CREATE_UNICODE_ENVIRONMENT

    含义:如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符。

    ⑻值:DEBUG_PROCESS

    含义:如果这个标志被设置,调用进程将被当做一个调试程序,并且新进程会被当做被调试的进程。系统把被调试程序发生的所有调试事件通知给调试器。

    如果你使用这个标志创建进程,只有调用进程(调用CreateProcess函数的进程)可以调用WaitForDebugEvent函数。

    ⑼值:DEBUG_ONLY_THIS_PROCESS

    含义:如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象。如果调用进程没有被调试,有关调试的行为就不会产生。

    ⑽值:DETACHED_PROCESS

    含义:对于控制台进程,新进程没有访问父进程控制台的权限。新进程可以通过AllocConsole函数自己创建一个新的控制台。这个标志不可以与CREATE_NEW_CONSOLE标志一起使用。

    〔11〕值:CREATE_NO_WINDOW

    含义:系统不为新进程创建CUI窗口,使用该标志可以创建不含窗口的CUI程序。

    dwCreationFlags参数

    还用来控制新进程的优先类,优先类用来决定此进程的线程调度的优先级。如果下面的优先级类标志都没有被指定,那么默认的优先类是NORMAL_PRIORITY_CLASS,除非被创建的进程是IDLE_PRIORITY_CLASS。在这种情况下子进程的默认优先类是IDLE_PRIORITY_CLASS

    可以选择下面的标志中的一个:

    优先级:HIGH_PRIORITY_CLASS

    含义:指示这个进程将执行时间临界的任务,所以它必须被立即运行以保证正确。这个优先级的程序优先于正常优先级或空闲优先级的程序。一个例子是Windows任务列表,为了保证当用户调用时可以立刻响应,放弃了对系统负荷的考虑。确保在使用高优先级时应该足够谨慎,因为一个高优先级的CPU关联应用程序可以占用几乎全部的CPU可用时间。

    优先级:IDLE_PRIORITY_CLASS

    含义:指示这个进程的线程只有在系统空闲时才会运行并且可以被任何高优先级的任务打断。例如屏幕保护程序。空闲优先级会被子进程继承。

    优先级:NORMAL_PRIORITY_CLASS

    含义:指示这个进程没有特殊的任务调度要求。

    优先级:REALTIME_PRIORITY_CLASS

    含义:指示这个进程拥有可用的最高优先级。一个拥有实时优先级的进程的线程可以打断所有其他进程线程的执行,包括正在执行重要任务的系统进程。例如,一个执行时间稍长一点的实时进程可能导致磁盘缓存不足或鼠标反映迟钝。

    lpEnvironment

    指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。

    一个环境块存在于一个由以NULL结尾的字符串组成的块中,这个块也是以NULL结尾的。每个字符串都是name=value的形式。

    因为相等标志被当做分隔符,所以它不能被环境变量当做变量名。

    与其使用应用程序提供的环境块,不如直接把这个参数设为空,系统驱动器上的当前目录信息不会被自动传递给新创建的进程。对于这个情况的探讨和如何处理,请参见注释一节。

    环境块可以包含Unicode或ANSI字符。如果lpEnvironment指向的环境块包含Unicode字符,那么dwCreationFlags字段的CREATE_UNICODE_ENⅥRONMENT标志将被设置。如果块包含ANSI字符,该标志将被清空。

    请注意一个ANSI环境块是由两个零字节结束的:一个是字符串的结尾,另一个用来结束这个快。一个Unicode环境块是由四个零字节结束的:两个代表字符串结束,另两个用来结束块。

    lpCurrentDirectory

    指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。

    lpStartupInfo

    指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体

    lpProcessInformation

    指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。

    返回值:

    如果函数执行成功,返回非零值。

    如果函数执行失败,返回零,可以使用GetLastError函数获得错误的附加信息。

    自定义数据类型

    自定义数据类型:
    1、STARTUPINFO(进程信息)

    .版本 2
    
    .数据类型 STARTUPINFO, 公开, 进程启动信息(进程_创建)
    .成员 cb, 整数型
    .成员 lpReserved, 整数型
    .成员 lpDesktop, 整数型
    .成员 lpTitle, 整数型
    .成员 dwX, 整数型
    .成员 dwY, 整数型
    .成员 dwXSize, 整数型
    .成员 dwYSize, 整数型
    .成员 dwXCountChars, 整数型
    .成员 dwYCountChars, 整数型
    .成员 dwFillAttribute, 整数型
    .成员 dwFlags, 整数型
    .成员 wShowWindow, 长整数型
    .成员 cbReserved2, 长整数型
    .成员 lpReserved2, 整数型
    .成员 hStdInput, 整数型
    .成员 hStdOutput, 整数型
    .成员 hStdError, 整数型

    2、PROCESS_INFORMATION(进程标识)

    .版本 2
    
    .数据类型 PROCESS_INFORMATION, 公开, 进程标识(进程_创建)
    .成员 hProcess, 整数型, , , 进程句柄
    .成员 hThread, 整数型, , , 线程句柄
    .成员 dwProcessId, 整数型, , , 进程标识符
    .成员 dwThreadId, 整数型, , , 线程标识符
    
    

    进程_创建命令源码

    .版本 2
    
    .子程序 进程_创建, 整数型, 公开, 返回非 0 表示成功,0表示失败
    .参数 程序路径, 文本型, , 程序的路径
    .参数 启动参数, 文本型, 可空
    .局部变量 目录, 文本型
    .局部变量 传参, STARTUPINFO
    .局部变量 a, PROCESS_INFORMATION
    
    目录 = 取文本左边 (程序路径, 倒找文本 (程序路径, “\”, , 假))
    返回 (CreateProcess (程序路径, 启动参数, 0, 0, 4, 0, 0, 目录, 传参, a))

    易语言模块API教程进程创建

    展开全文
  • 如果您的应用程序庞大,或者您预计它会变得庞大,将API放在自己的子域(例如 api。 )上是一个不错的选择。这可以允许在路上一些更灵活的可扩展性。 如果您预计您的API将不会增长到那么大,或者您想要一个更简单...
  • 创建API 为中心的 Web 应用

    千次阅读 2014-01-21 13:28:27
    在这篇教程中,我们将讨论如何创建API为中心的网络应用,还会解释在今天的多平台世界,这类应用为什么是重要的。  引言  API?  对于还不甚熟悉这个术语的朋友,API是Application Programming ...
  • 第一步创建项目 完成后右键Model项目名添加数据库 默认直接下一步,然后新建连接,我选的本机装的MSSqlServer,如果要连接远程的话服务器名就输入对应主机ip。 保存密码后,如果连接成功点击下拉列表就能...
  • linux进程创造 - 创建进程API及过程

    千次阅读 2016-11-20 00:56:20
    1. 创建进程函数API1.1 创建进程fork()fork的翻译为“叉子,分叉”,其实在unix编程中,我们来创建进程的时候是深有体会的,感觉创建一个进程就像是走到了一个岔路口,父进程和子进程在叉路口分道扬镳,所以我想这...
  • .net5创建WebApi项目入门教程

    千次阅读 2021-01-25 21:13:16
    .net5已经出来好久了,我刚好要做一个.net5的项目,于是打算写一个关于.net5的入门系列教程,主要是记录自己用.net5开发一个系统过程的,希望自己能坚持住,把这一系列教程完成。 1.开发环境准备 要使用.net5进行...
  • Zookeeper客户端API创建节点(七)

    万次阅读 2017-03-24 10:16:05
    本篇博客主要讲一下使用Zookeeper原生的客户API创建一个数据节点。 创建数据节点方法 Zookeeper提供了两个创建数据节点的方法。 同步创建数据节点方法: public String create(final String path, byte data[]...
  • 本教程将演示如何通过响应式移动专用布局窗口小部件创建移动友好的webapp 1、支持的设备 这个模板支持安卓和IOS横向和纵向姿态,它使用Dojo Mobile框架并包含Dojo标题窗口等小部件。 2、使用移动Web...
  • API发卡君创建比特币收款API教程 支持币种 比特现金:bch 比特币:btc 比特黄金:btg 达世币:dash 狗狗币:doge 以太币:eth 莱特币:ltc USDT:usdt 更多币种可以去官网查看:www.fakajun.com API在...
  • C# WebAPI创建及具体实现

    万次阅读 2018-11-22 22:35:47
    比如:天气预报,微信支付等都是使用的接口,这样我们在编程过程中就可以使用别人已经写好的接口,可以省很多时间和精力,当然一些我们自己使用的,就需要我们自己去编写了,下面介绍用C#写API接口的具体实现方法。...
  • 易语言api hook CreateProcessA 创建进程

    千次阅读 2020-05-25 11:15:58
    CreateProcessA我们非常熟悉,就是创建一个进程,这个API的函数hook非常实用,本课我们可以通过CreateProcessA来运行系统的计算器,或者记事本等等。 CreateProcessA .版本 2 .DLL命令 CreateProcessA, 整数...
  • 创建微服务-用API网关实现

    千次阅读 2018-06-15 17:02:03
    创建微服务-用API网关实现第一篇文章讲述了微服务的创建、设计和部署。同时,也讨论了关于应用微服务的优点和缺点。虽然微服务结构复杂,但它是处理复杂程序架构的理想选择。本文讲述通过API网关构造微服务。当你...
  • 首先这是一篇国外的英文文章,非常系统、详尽的介绍了如何使用PHP创建REST API,国内这方面的资料非常非常的有限,而且基本没有可操作性。这篇文章写的非常好,只要对PHP稍有了解的程序员,看完本文基本可以自己动手...
  • 易语言API HooK CreateThread创建线程

    千次阅读 2020-05-28 11:44:49
    本课对API(Createthread)进行了Hook,首先我们在测试程序里启动一个线程,可以使用易语言的启动线程 (&工作, , 线程句柄)也可以直接调用API(Createthread)我们这里分了两种情况测试,第一,钩子写到测试文件里,...
  • 阿里api网关接口创建、发布、授权、调试 下面会出现关于签名认证和阿里云api认证的概念以及认证方式的选择,如果这些还不是很清楚的可以看下我的上篇文章: 《阿里云api网关的认证方式介绍以及选择》...
  • ZooKeeper API使用 I 创建节点

    千次阅读 2018-08-27 10:49:46
    客户端可以通过 ZooKeeper 的 API创建一个数据节点,有如下两个接口: String create(final String path, byte data[], List&amp;lt;ACL&amp;gt; acl, CreateMode createMode) void create(final ...
  • 在地图上绘制之创建标注 官方demo示例和讲解——直戳这里 简介 所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。 覆盖物拥有自己的地理坐标,当拖动或缩放地图时,它们会相应的移动。 覆盖物主要分为:...
  • 二、创建项目 1.选择【文件】→【新建】→【项目】 2.新建一个名称为CoreBackend.Api的【.NET Core】的【ASP.NET Core Web 应用程序】 二.1 解读项目生成的代码 Program.cs 这个Program是程序的入口, 看...
  • FastAPI 项目结构组织,工厂模式创建

    千次阅读 2020-06-24 17:28:39
    FastAPI 项目结构组织,工厂模式创建 前言 学习Vue的时候,需要接口,而我恰巧也学习了下FastAPI,正好个人项目,试一下这个FastAPI框架。 然而 现在关于FastAPI,搜索资料基本都是官网翻译一下,要么就是官方推荐的...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    javax.xml.soap 提供用于创建和构建 SOAP 消息的 API。 javax.xml.stream javax.xml.stream.events javax.xml.stream.util javax.xml.transform 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 ...
  • 本文旨在介绍如何使用常用的 Swagger 和 Swashbuckle 框架创建描述 Restful API 的交互界面,并为 API 用户提供丰富的探索、文件和操作体验。
  • 但可以针对设定网络模型(自己使用API创建网络模型)或给定模型(使用NvCaffeParser或NvUffPaser导入其他深度学习框架训练好的模型)做一系列优化,以加快推理速度(inference)。 使用C++ API函数部署网络主要分为...
  • 自己网页调用百度地图API

    千次阅读 2016-06-10 20:06:07
    百度地图API自定义地图 地图生成工具基于百度地图JS api v2.0版本开发,使用请申请密匙。 了解如何申请密匙 申请密匙 //创建和初始化地图函数: function initMap(){ createMap();//创建地图 ...
  • hbase使用api创建

    千次阅读 2015-12-15 13:20:54
    这两个函数是用户需要自己region的划分。这个函数的参数splitKeys是一个二维字节数据,行的最大数表示region划分数+1,列就表示region和region之间的行键。比如: [java]   view plain copy ...
  • 通过 Amazon API Gateway,您可以根据在 AWS Lambda 中运行的代码快速、轻松地创建自定义 API,然后通过 API 调用 Lambda 代码。Amazon API Gateway 可以用您的账户执行 AWS Lambda 代码,也可以在 AWS 外部通过可
  • Elasticsearch 关于java的api网上有不少资料了,我打算把这些天的内容整理一下发上来。主要说一下如何使用java 对于es搜索引擎创建一个新的mapping。不过再上代码之前有几点总结说一下哈,我觉得是有不少新手不清楚...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 795,840
精华内容 318,336
关键字:

如何创建自己的api