GO 语言 Web 开发实战一

article/2025/11/5 18:17:09

xdm,咱今天分享一个 golang web 实战的 demo

go 的 http 包,以前都有或多或多的提到一些,也有一些笔记在我们的历史文章中,今天来一个简单的实战

HTTP 编程 Get

先来一个 小例子,简单的写一个 Get 请求

  • 拿句柄

  • 设置监听地址和端口

  • 进行数据处理

    package mainimport ("fmt""net/http"
    )func myHandle(w http.ResponseWriter, req *http.Request){defer req.Body.Close()par := req.URL.Query()fmt.Println("par :",par)//回写数据fmt.Fprintln(w,"name",par.Get("name"),"hobby",par.Get("hobby"))}// server 端
    func main() {http.HandleFunc("/", myHandle)err := http.ListenAndServe("0.0.0.0:9999", nil)if err != nil{fmt.Printf("ListenAndServe err : %v",err)return}}

上述的代码比较简单,就是一个简单的 http get 请求 , 主要处理数据的是 myHandle 函数

Client 客户端 实现方法 get

  • client.go

    • get方法、post方法、patch方法、head方法、put方法等等,用法基本一致
    • 设置url
    • get (或者其他方法)方法请求 url
    • 处理数据
    package mainimport ("fmt""io/ioutil""net/http""net/url"
    )//httpserver 端
    func main() {//1.处理请求参数params := url.Values{}params.Set("name", "xiaomotong")params.Set("hobby", "乒乓球")//2.设置请求URLrawUrl := "http://127.0.0.1:9999"reqURL, err := url.ParseRequestURI(rawUrl)if err != nil {fmt.Printf("url.ParseRequestURI() 函数执行错误,错误为:%v\n", err)return}//3.整合请求URL和参数reqURL.RawQuery = params.Encode()//4.发送HTTP请求// reqURL.String() String将URL重构为一个合法URL字符串。fmt.Println("Get url:", reqURL.String())resp, err := http.Get(reqURL.String())if err != nil {fmt.Printf("http.Get()函数执行错误,错误为:%v\n", err)return}defer resp.Body.Close()//5.一次性读取响应的所有内容body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("ioutil.ReadAll()函数执行出错,错误为:%v\n", err)return}fmt.Println("Response: ", string(body))
    }

上述编码中有使用到 reqURL.RawQuery = params.Encode()

Encode 方法将请求参数编码为 url 编码格式 (“a=123&b=345”),编码时会以键进行排序

常见状态码

  • http.StatusContinue = 100
  • http.StatusOK = 200
  • http.StatusFound = 302
  • http.StatusBadRequest = 400
  • http.StatusUnauthorized = 401
  • http.StatusForbidden = 403
  • http.StatusNotFound = 404
  • http.StatusInternalServerError = 500

HTTP 编程 Post 方法

  • 编写 server 代码 server.go

  • 设置句柄

  • 设置监听地址和端口

  • 处理相应数据

    package mainimport ("fmt""io/ioutil""net/http"
    )func handPost(w http.ResponseWriter, req *http.Request) {defer req.Body.Close()if req.Method == http.MethodPost {b, err := ioutil.ReadAll(req.Body)if err != nil {fmt.Printf("ReadAll err %v", err)return}fmt.Println(string(b))resp := `{"status":"200 OK"}`w.Write([]byte(resp))fmt.Println("reponse post func")} else {fmt.Println("can't handle ", req.Method)w.Write([]byte(http.StatusText(http.StatusBadRequest)))}
    }//post serverfunc main() {http.HandleFunc("/", handPost)err := http.ListenAndServe("0.0.0.0:9999", nil)if err != nil {fmt.Printf("ListenAndServe err %v", err)return}
    }

Client 客户端 实现

  • client.go

    • get方法、post方法、patch方法、head方法、put方法等等,用法基本一致
    • 设置 url
    • post 方法请求
    • 处理数据
    package mainimport ("fmt""io/ioutil""net/http""strings"
    )//post clientfunc main() {reqUrl := "http://127.0.0.1:9999"contentType := "application/json"data := `{"name":"xiaomotong","age":18}`resp, err := http.Post(reqUrl, contentType, strings.NewReader(data))if err != nil {fmt.Printf("Post err %v", err)return}defer resp.Body.Close()b, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Printf("ReadAll err %v", err)return}fmt.Println(string(b))}

上述 post 方法的编码 明显 比 get 方法的编码传参多了很多,我们一起来看看官方源码是如何做的

func Post(url, contentType string, body io.Reader) (resp *Response, err error) {return DefaultClient.Post(url, contentType, body)
}
  • url

请求地址

  • contentType

内容的类型,例如 application/json

  • body

具体的请求体内容,此处是 io.Reader 类型的,因此我们传入数据的时候,也需要转成这个类型

表单 form 的处理

既然是 web 相关的实战,表单肯定是一个离不开的话题 , golang 里面当然有对表单的实际处理功能

  • 前面逻辑一样,服务端开启服务,监听端口
  • 每个路由对应这个处理函数
  • 处理函数中 request.ParseForm() 解析表单的具体数据
package mainimport ("fmt""io""net/http"
)const form = `<html><body><form action="#" method="post" name="bar"><input type="text" name="in"/><input type="text" name="out"/><input type="submit" value="Submit"/></form></html></body>`func HomeServer(w http.ResponseWriter, request *http.Request) {io.WriteString(w, "<h1>/test1 或者/test2</h1>")
}func SimpleServer(w http.ResponseWriter, request *http.Request) {io.WriteString(w, "<h1>hello, xiaomotong</h1>")
}func FormServer(w http.ResponseWriter, request *http.Request) {w.Header().Set("Content-Type", "text/html")switch request.Method {case "GET":io.WriteString(w, form)case "POST":request.ParseForm()fmt.Println("request.Form[in]:", request.Form["in"])io.WriteString(w, request.Form["in"][0])io.WriteString(w, "\n")io.WriteString(w, request.Form["out"][0])}
}
func main() {http.HandleFunc("/", HomeServer)http.HandleFunc("/test1", SimpleServer)http.HandleFunc("/test2", FormServer)err := http.ListenAndServe(":9999", nil)if err != nil {fmt.Printf("http.ListenAndServe()函数执行错误,错误为:%v\n", err)return}
}

上述编码解析表单的逻辑是:

对于 POST、PUT 和P ATCH 请求,它会读取请求体并解析它,作为一个表单,会将结果放入r.PostFormr.Form

请求体 r.Form 中的参数优先于 URL 查询字符串值

先来看看 Request 的结构 ,参数会比较多

type Request struct {Method stringURL *url.URL.... 此处省略多行 ...ContentLength int64//Form包含解析过的表单数据,包括URL字段的查询参数和PATCH、POST或PUT表单数据。//此字段仅在调用 ParseForm 后可用Form url.Values//PostForm包含来自 PATCH、POST或PUT主体参数的解析表单数据。//此字段仅在调用 ParseForm 后可用。PostForm url.Values//MultipartForm是解析的多部分表单,包括文件上传。//该字段仅在调用 parsemmultipartform 后可用。MultipartForm *multipart.FormTrailer HeaderRemoteAddr stringRequestURI stringTLS *tls.ConnectionStateCancel <-chan struct{}Response *Responsectx context.Context
}

下面是具体实现的源码,感兴趣的 xdm 可以打开 goland 看起来

实际处理逻辑在 func parsePostForm(r *Request) (vs url.Values, err error) {

这里需要注意

  • 请求提的大小上限为10MB , 需要注意请求体的大小是否会被 MaxBytesReader 限制

模板

听到 模板 这个名词应该不陌生了吧,很多组件或者语言里面都有模板的概念

感兴趣的可以琢磨一下,我们放在下一篇补充

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


http://chatgpt.dhexx.cn/article/IRH91OeQ.shtml

相关文章

goweb开发实战笔记(一)

目录 &#x1f9e1;Gin简介 &#x1f9e1;Gin特性 &#x1f9e1;Gin环境搭建 &#x1f9e1;HTTP请求和参数解析 创建Engine Handle方法处理 Engine分类处理 表单实体绑定 ShouldBindQuery ShouldBind JSON 多数据格式返回请求结果 []byte切片 string JSON HTML…

golang学习之go web 开发

文章目录 一、hello world二、请求处理1、url参数处理2、form参数处理3、header参数处理 三、响应处理1、ResponseWriter 四、cookie五、session实现1、session id2、session的存储3、session过期4、实现代码1、session 操作代码2、web服务3、登录页面4、session数据展示页面 一…

FlexSlider图片轮播切换jQuery插件

下载地址 flexSlider是一款强大的图片轮播插件。参数说明animation: "slide", // String: ["fade"|"slide"]&#xff0c;动画效果easing: "swing", // String: 滚动动画计时函数direction: "horizonta…

jQuery FlexSlider插件一些使用上的小tips

最近做的一个需求&#xff0c;用到了jQuery FlexSlider这个插件&#xff0c;本以为一个算是已经比较成熟的插件&#xff0c;用起来应该没什么难度&#xff0c;然而真正用起来才发现&#xff0c;其实还是有些坑的&#xff0c;不过好在这个插件源代码写的比较好&#xff0c;比较好…

jquery.flexslider-min.js实现banner轮播图效果

查看演示 立即下载 插件描述&#xff1a; jquery图片轮播插件仿支付宝2013版全屏图片幻灯片淡出淡进切换效果 实现方法 引用jquery和flexslider.js到你的页面 <script type"text/javascript" src"js/jquery-1.7.2.min.js"></script> <sc…

Vue+Element-ui实例_使用flexslider插件设计横向时间线

下面是做了一个类似时间线(history事件线)的页面&#xff0c;主要是记录一下log&#xff0c;或者history的操作记录。 主要难点&#xff1a; &#xff08;1&#xff09;一般的插件时间线例如(elementUI中的el-timeline)就是纵向的时间线&#xff0c;如果数据过多的话&#xf…

flexSlider 图片轮播插件的使用(附参数设置)

前提&#xff1a;下载插件&#xff08;官网下载地址&#xff1a;http://flexslider.woothemes.com/ 请用IE打开&#xff0c;chrome可能打不开&#xff1b;其他下载地址&#xff1a;点击打开链接&#xff09;&#xff0c;并引入flexslider.css和jquery.flexslider-min.js文件(缺…

flex

水平垂直居中也算是 CSS 领域最为常见的一个问题了&#xff0c;不同场景下的方法也各不相同&#xff0c;各有优劣。嗯&#xff0c;下面这种应该算是最便捷的了&#xff1a; <div class"g-container"><div class"g-box"></div> </div…

轮播插件——flexslider

轮播插件——flexslider, 首先&#xff0c;当我们需要轮播插件的时候呢&#xff0c;去浏览器中找自己需要的轮播插件&#xff0c;比如&#xff0c;搜索关键词“JQuery轮播插件”&#xff0c;就会出来很多网站&#xff0c;选一个点进去&#xff0c;预览效果&#xff0c;然后下载…

重现Struts1的操纵classLoader漏洞

注&#xff1a;本文仅限技术研究&#xff0c;探讨&#xff0c;测试使用. 2014年4月29日爆出的struts的可操纵classLoader的漏洞&#xff0c; 横跨struts1和struts2的所有版本。 影响面和问题的严重性几乎可以和heartbleed相媲美。 struts2要严重一些&#xff0c;对于struts1&am…

Struts1、Struts2、Hibernate、Spring框架工作原理介绍

Struts1工作原理 Struts1工作原理图 1 、初始化&#xff1a; struts 框架的总控制器 ActionServlet 是一个 Servlet &#xff0c;它在 web.xml 中配置成自动启动的 Servlet &#xff0c;在启动时总控制器会读取配置文件 (struts-config.xml) 的配置信息&#xff…

Struts1 和 Struts2

关于Struts2的出现缘由和好处就不多说啦&#xff0c;看了几篇总结的不错的文章&#xff0c;整理下贴出来&#xff0c;共同学习了。 Action的区别 对于有着丰富的Struts1.x开发经验的朋友来说&#xff0c;都十分的清楚Action是整个Struts框架的核心内容&#xff0c;当然Struts2也…

Struts1的工作流程

Struts1的工作流程图如下所示&#xff1a; 其工作流程如下&#xff1a; 当Web服务器启动的时候&#xff0c;根据web.xml文件加载并初始化ActionServlet&#xff0c;根据配置ActionServlet的config参数信息&#xff0c;确定struts-config.xml配置文件存放的位置&#xff0c;并根…

struts2讲解

Struts2部分 1. JavaEE软件三层结构和MVC的区别&#xff1f; JavaEE软件三层机构是由sun公司提供JavaEE开发规范的&#xff1a;Web层(表现层)、业务逻辑层、数据持久层。【其中WEB层会使用前端控制器模式】 MVC是一种思想&#xff0c;是一种模式&#xff0c;将软件分为 Model…

Struts1和Struts2对比

最近学习了Struts1和Struts2.很多人、很多资料都提到。Struts2不是从Struts1发展而来的。Struts2的前身是WebWork。那它俩到底有多大的不同呢&#xff0c;看了一些资料&#xff0c;下边就来比较比较。 一、架构分析 Struts1的架构图&#xff1a; 执行流程&#xff1a; 1.…

Struts1.x使用入门

Struts1框架是apache公司的开源子项目&#xff0c;是基于mvc逻辑分层的web层框架实现。是出现最早的web层框架&#xff0c;应用最广发。Struts1框架重点关注的是控制层&#xff0c;对于视图层只是提供了大量的标签&#xff1b;对于model层的影响微乎其微。 本文也是本人初学st…

Struts1的路径映射详解

首先介绍下struts1种xml配置的相关概念&#xff1a; • Action 的path: ActionServlet 根据该属性来转发用户的请求&#xff0c;即将用户请求转发与之同名的Action 。同名的意思是:将请求的.do 后缀去掉&#xff0c;匹配Action 的path属性值。 • Action 的name: 此处的name 属…

Struts1框架轻易入门,经典示例

Struts1框架轻易入门&#xff0c;经典示例 版权申明&#xff1a;此文为作者原创&#xff0c;未经允许&#xff0c;请勿转载&#xff01; Struts工作原理及流程登录验证示例 Struts1 工作原理及流程 这是本人整理的一点材料&#xff0c;原理图为纯手工绘制&#xff0c;不喜勿喷&…

struts1框架基本(笔记)

在阿帕奇官网下载合适的struts1框架文件。 应用在显示层框架。 struts1与struts2虽然是一脉相承&#xff0c;但它们用法完全不一样。 struts2是在struts1与webwork基础上&#xff0c;发展的全新框架。 注&#xff1a;本文是在MyEclipse下进行的操作&#xff0c;不是之前的E…

Struts1介绍

struts&#xff1a;[strʌts]支柱; 撑杆; 支杆; 支撑; 趾高气扬的步态; 高视阔步的样子; 引入struts Model1结构如图1所示&#xff1a; Model1是一个以JSP文件为中心的模式&#xff0c;在这种模式中JSP页面不仅负责表现逻辑&#xff0c;也负责控制逻辑。专业书籍上称之为逻辑…