Top

Advanced -HTTP service

Development for HTTP services with Z1h is a very simple thing

Start

at the command line, type z1h -web 30030 Above example can be opened at 30030 http service port Can also be used to configure File (conf.json file after decompression) z1h -conf conf.json You can see the command line output Initing z1h... [Zwei.Ren/Web] Running on port :30030 with 8 routers. [Zwei.Ren/Web] You may visit at 192.168.1.2:30030 Visit the following address : http://127.0.0.1:30030 you can see Hello World! -- ZweiRen.Web

File Structure

The file structure is automatically created under the datas directory of this directory. Some examples are as follows: |File name|Use| |:-:|:-:| api|Storge interface file assets|Store some resource files front|Generally used to store static front-end files

Interface

The interface is in the datas/api directory, create a file with the suffix .z1h, you can create an interface for example: // datas/api/hello.z1h "Hello World!" You can access http://127.0.0.1:30030/api/hello and fetch the return of the interface data

Request and Response

In the z1h file, each request will have a global variable this (also can be request), the type is * SimpleRouter, which contains all the request information of the http request and response method // Request print(this.Method) // request method, such as get/post/put/delete/options print(this.Request.URL.String()) // request path print(this.GetGetParamMap()) // parameter in the url print(this.GetHeaders()) // request header information print(string(this.GetBody())) // request body print(string(this.GetPostParams())) // The parsed request body print(this.IP()) // requester IP print(Object.keys(this.GetFileParams())) // Get the file(field name) in the request body // Response this.Redirect(302, "https://z1h.org/") // Request 302 redirect this.ServeFile("datas/favicon.ico") // respond to the file this.ResponseHeader("Content-Type", "text/plain") // set the response header this.ResponseStatus(201) // Set the response status code this.Tpl("hello", {title: "Template Test"}) // Response template file(views/hello.tpl) For specific usage, please refer to the bottom of the appendix/SimpleRouter

Router

You can create a directory under the datas/api directory, and then create a .z1h file under the directory, you can automatically speak the corresponding path of the HTTP request to this interface. For example: // datas/api/account/info.z1h file `Your IP: ${this.IP()}, browser: ${this.GetHeader("User-Agent")}` Now you can access http://127.0.0.1:30030/api/account/info to see your IP and browser UserAgent information

Default handler

creates index.z1h under thedatas / api directory (or sub-directory), which can handle the default path eg: // datas/api/account/index.z1h `current time Is ${now()}` You can visit http://127.0.0.1:30030/api/account/index to see the returned time information You can also ignore the last index, directly visit http://127.0.0.1:30030/api/account/ see the same response data

The 404 page

You can creates 404.z1h under the datas/api directory (or subdirectory), which can handle requests when the requested address does not exist. For example: // datas/api/account/404.z1h file `You go the wrong way` Access http://127.0.0.1:30030/api/account/xxx to See the 404 message

assets resources

assets directory is suitable for storing some static resources, such as jQuery.js, etc. For example, if you copy the image to datas/assets/logo.png, you can use http://127.0.0.1:30030/assets/logo.png Get the picture. Try to put a js file in it, then put an html file to reference it

front

front folder is used to deploy front-end frameworks such as VUE - Firstly make sure it is configured through z1h -conf started by way of file - The content corresponding to "key" in the configuration file is not empty, it is the key to update the front end, and the line is not commented - Export the dist directory (such as using npm run build) - The dist The directory is compressed into a zip file - Open http://127.0.0.1:30030/vueupdate - Upload dist.zip, enter the key, confirm You can go to http://127.0.0.1:30030/ See the project you deployed

Appendix

SimpleRouter

structure | name | type | description | example |:-:|:-:|:-:|:-:| Method | string | Request method(lowercase) | if (this.method!='Post')panic("Post Only!") DisableGZip | bool | Whether to try to gzip the result | this.DisableGZip = false // Make sure not to compress Writer | ResponseWriter | Include Write, WriteHeader, Header methods | this.Writer.Write (bytearray ("nihao")) Request|*net/http.Request|Go standard library structure|this.Request.URL.String() Method to get the request content | name | description | parameter | return value | example | |:-:|:-:|:-:|:-:|:-:| IP | Get Requester IP |-| string GetGetParamMap | Get all query parameters in url |-| map [string] string GetGetParam | Get a query parameter in url | string field name | string field value | if (this.GetGetParam ("name") == "admin") return `Admin Hello` GetGetIntParam | Get a query integer parameter in the url | string field name, int default value | int parameter value | GetHeaders | Get all the header information in the request |-| map [string] [] string GetHeader | Get a certain header information in the request | string header key | string header value | if (this.GetHeader ("User -Agent "). Contains (" android ")) return `Hello Android user` GetBody | Get the original request body |-| [] byte | return `Request body length $ {len (this.GetBody())}` GetPostParams | Get the deserialized request body content |-| map GetPostParam | Get request body parameters | string field name | field value | GetFileParams | get file submitted by form |-| map [string] * MultipartFileData GetFileParam | get a file submitted by form | string field name | * MultipartFileData response related method | name | Description | Parameters | Return Value | Example | |:-:|:-:|:-:|:-:|:-:| Redirect | Redirect | int Status code, string link address |-| this.Redirect(302, "https://z1h.org") ServeFile | response file | string file path |-| this.ServeFile ("datas / favicon.ico") ResponseHeader | set response header | string header key, string header value | -| this.ResponseHeader ("Content-Type", "text / plain") ResponseStatus | Set response status code | int status code |-| this.ResponseStatus (201) Tpl | Response template file | string template name, template fill content , string sub-template … |-| this.Tpl ("hello", {title: "Template test "})