当前位置: 首页 > news >正文

网站建设方案书模版网络编程技术实验报告

网站建设方案书模版,网络编程技术实验报告,wordpress点赞和打赏,群晖6.0.2 wordpress✨✨ 欢迎大家来到景天科技苑✨✨ #x1f388;#x1f388; 养成好习惯#xff0c;先赞后看哦~#x1f388;#x1f388; #x1f3c6; 作者简介#xff1a;景天科技苑 #x1f3c6;《头衔》#xff1a;大厂架构师#xff0c;华为云开发者社区专家博主#xff0c;… ✨✨ 欢迎大家来到景天科技苑✨✨ 养成好习惯先赞后看哦~ 作者简介景天科技苑 《头衔》大厂架构师华为云开发者社区专家博主阿里云开发者社区专家博主CSDN全栈领域优质创作者掘金优秀博主51CTO博客专家等。 《博客》Python全栈Golang开发PyQt5和Tkinter桌面开发小程序开发人工智能js逆向App逆向网络系统安全数据分析Djangofastapiflask等框架云原生K8Slinuxshell脚本等实操经验网站搭建数据库等分享。 所属的专栏Go语言开发零基础到高阶实战 景天的主页景天科技苑 文章目录 Go语言http编程一、HTTP基础概念1. HTTP请求2. HTTP响应3. HTTP/1.1与HTTP/2 二、http编程实战1. HTTP服务器2. HTTP客户端3. 带参数的请求4. POST请求提交Form表单5. POST请求提交Json数据 三、错误处理 Go语言http编程 HTTPHyperText Transfer Protocol是互联网上应用最广泛的一种网络协议。无论是浏览网页、使用API进行数据传输还是实现微服务架构HTTP都扮演着至关重要的角色。Go语言又称Golang以其简洁、高效和强大的并发处理能力成为了HTTP编程的优选语言之一。 一、HTTP基础概念 在深入了解Go语言的HTTP编程之前我们需要先了解一些HTTP的基础知识。 1. HTTP请求 请求方法GET、POST、PUT、DELETE等 请求URL包括协议、主机名、端口号、路径和查询参数 请求头包含元数据如Content-Type、Authorization等 请求体对于POST、PUT等请求方法通常包含要发送的数据 2. HTTP响应 状态码如200 OK、404 Not Found、500 Internal Server Error等 响应头包含元数据如Content-Type、Location等 响应体包含返回的数据 3. HTTP/1.1与HTTP/2 HTTP/1.1是广泛使用的版本支持持久连接和缓存控制。 HTTP/2引入了多路复用、头部压缩和服务器推送等特性提高了性能。 二、http编程实战 1. HTTP服务器 Go语言内置的net/http包提供了简单的HTTP服务器实现。 开启监听程序的代码是放在main方法的最后一行的 以下是一个基本的HTTP服务器示例 // http_server.go package mainimport (fmtnet/http )// 定义发送接收数据函数 func helloHandler(w http.ResponseWriter, r *http.Request) {// 给浏览器响应数据// 一般会响应一些信息给客户端 文字、网页 resp.Write// 响应一段文字[]byte(hello,web)// 响应一段html代码 []byte(html代码) 网页// Write([]byte) (int, error)_, err : w.Write([]byte(h1感谢大家来到景天科技苑!/h1))if err ! nil {return}//查看请求fmt.Println(请求方法: , r.Method)fmt.Println(请求体: , r.Body)fmt.Println(请求头, r.Header)fmt.Println(请求路径:, r.URL)fmt.Println(客户端地址:, r.RemoteAddr) //包含ip和端口号 }func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的一直监听请求// 访问这个url就会触发 helloHandler 函数 Request ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径第二个参数是一个函数http.HandleFunc(/, helloHandler)fmt.Println(Starting server at :8080)// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil此时会使用DefaultServeMux。//如果用户自定义实现了Handler那么根据相应路径在map中查询到相对应的Handler然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler只注册了对应处理函数(使用了http.HandleFunc)那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err : http.ListenAndServe(127.0.0.1:8080, nil); err ! nil {fmt.Println(Error starting server:, err)} }浏览器访问 2. HTTP客户端 除了HTTP服务器Go语言也提供了强大的HTTP客户端功能。以下是一个基本的HTTP客户端示例 package mainimport (fmtionet/http )// 手写客户端访问 func main() {/*http.Get()*/// 一个请求包含 请求方式 请求的url 接收响应结果// func Get(url string) (resp *Response, err error)resp, _ : http.Get(http://localhost:8080)// 通过defer关闭连接 resp.Body 响应的主体//通过Body来关闭defer resp.Body.Close()fmt.Println(resp.Body)fmt.Println(resp.Status) // 200 OKfmt.Println(resp.Header) // 响应头// 接收具体的响应内容从Body里面获取//Body是IO流// The response body is streamed on demand as the Body field is read.// Body io.ReadCloser//循环从Body流中读取buf : make([]byte, 1024)for {n, err : resp.Body.Read(buf)if err ! nil err ! io.EOF {fmt.Println(读取出现了错误)return} else {fmt.Println(读取完毕)res : string(buf[:n])fmt.Println(服务器响应的数据为, res)break}}}3. 带参数的请求 客户端编写 url的参数拼接 拼接 连接 package mainimport (fmtionet/httpnet/url )func main() {// 复杂请求urlStr : http://127.0.0.1:8080/login // ?// 参数如何拼接到url上参数封装为数据url.Values{}data : url.Values{}//通过url.Values.Set()方法将参数拼接到url上data.Set(username, admin) // ?data.Set(password, 123456) // ?// 将url字符串转化为url对象并给携带数据// func ParseRequestURI(rawURL string) (*URL, error)urlNew, _ : url.ParseRequestURI(urlStr)urlNew.RawQuery data.Encode()// http://127.0.0.1:8080/login?password123456usernameadmin// ? get的传参多个参数之间使用 连接fmt.Println(urlNew)//查看类型fmt.Printf(%T \n, urlNew)// 发请求,参数是一个字符串地址resp, _ : http.Get(urlNew.String())defer resp.Body.Close()// 读取resp响应信息一次性读完返回buf// func ReadAll(r Reader) ([]byte, error)buf, _ : io.ReadAll(resp.Body)fmt.Println(string(buf)) }服务端 // http_server.go package mainimport (fmtnet/http )// 定义发送接收数据函数 func login(resp http.ResponseWriter, req *http.Request) {// 模拟数据库中存在一个数据mysqlUserData : adminmysqlPwdData : 123456fmt.Println(接收到了login请求)// 拿到请求中的查询参数urlData : req.URL.Query()username : urlData.Get(username)password : urlData.Get(password)// 登录逻辑, 将客户端发送的数据和系统数据比对实现登录业务if username mysqlUserData {if password mysqlPwdData {resp.Write([]byte(登录成功))} else {resp.Write([]byte(密码错误))}} else {resp.Write([]byte(登录失败))}}func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的一直监听请求// 访问这个url就会触发 helloHandler 函数 Request ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径第二个参数是一个函数http.HandleFunc(/login, login)fmt.Println(Starting server at :8080)// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil此时会使用DefaultServeMux。//如果用户自定义实现了Handler那么根据相应路径在map中查询到相对应的Handler然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler只注册了对应处理函数(使用了http.HandleFunc)那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err : http.ListenAndServe(127.0.0.1:8080, nil); err ! nil {fmt.Println(Error starting server:, err)} }登录成功 4. POST请求提交Form表单 客户端 package mainimport (fmtionet/httpnet/url )func main() {// 目标URLurlStr : http://127.0.0.1:8080/register// 构建表单数据formData : url.Values{}formData.Set(username, admin)formData.Set(password, 123456)// 发送POST请求// func PostForm(url string, data url.Values) (resp *Response, err error)resp, err : http.PostForm(urlStr, formData)if err ! nil {fmt.Println(Error sending POST request:, err)return}defer resp.Body.Close()// 读取响应体body, err : io.ReadAll(resp.Body)if err ! nil {fmt.Println(Error reading response body:, err)return}// 打印响应状态码和响应体fmt.Println(Response Status:, resp.Status)fmt.Println(Response Body:, string(body)) }在这个例子中我们首先定义了目标URL和表单数据。然后我们使用 url.Values 类型的 formData 来存储表单键值对并通过 formData.Set 方法添加数据。最后我们调用 http.PostForm 函数发送请求并处理响应。 请注意http.PostForm 简化了表单数据的发送过程但如果你需要发送非表单数据如JSON你应该使用 http.NewRequest 和 http.Client.Do 方法来构建和发送自定义请求。 此外http.PostForm 发送的请求体是 application/x-www-form-urlencoded 格式的这通常用于HTML表单提交但不适用于所有类型的API请求。 服务端 // http_server.go package mainimport (fmtnet/http )// 定义发送接收数据函数 func register(resp http.ResponseWriter, req *http.Request) {fmt.Println(接收到了注册请求)// 解析表单// 处理表单的请求, 前端提交表单-后盾解析表单// func (r *Request) ParseForm() errorerr : req.ParseForm()if err ! nil {return}// 获取表单参数 postusername : req.PostForm.Get(username)password : req.PostForm.Get(password)fmt.Println(username, password)// 很多的判断// 短信// 验证码// 存到数据库resp.Write([]byte(注册成功)) }func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的一直监听请求// 访问这个url就会触发 helloHandler 函数 Request ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径第二个参数是一个函数http.HandleFunc(/register, register)fmt.Println(Starting server at :8080)// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil此时会使用DefaultServeMux。//如果用户自定义实现了Handler那么根据相应路径在map中查询到相对应的Handler然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler只注册了对应处理函数(使用了http.HandleFunc)那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err : http.ListenAndServe(127.0.0.1:8080, nil); err ! nil {fmt.Println(Error starting server:, err)} }客户端运行 服务端运行 http.NewRequest 和 http.Client.Do 发送表单请求 客户端 package mainimport (fmtionet/httpnet/urlstrings )func main() {// 构建HTTP客户端client : http.Client{}// 定义POST URLmyurl : http://127.0.0.1:8080/register// 定义HTTP负载data : url.Values{}data.Set(username, John Doe)data.Set(password, 123456)// 将url.Values编码为表单格式的字符串并创建一个Readerpayload : strings.NewReader(data.Encode())// 发送POST请求// func NewRequest(method, url string, body io.Reader) (*Request, error)req, err : http.NewRequest(POST, myurl, payload)if err ! nil {fmt.Println(Error creating request:, err)return}// 设置HTTP消息头req.Header.Set(Content-Type, application/x-www-form-urlencoded)// 执行HTTP请求// func (c *Client) Do(req *Request) (*Response, error)resp, err : client.Do(req)if err ! nil {fmt.Println(Error sending request:, err)return}defer resp.Body.Close()// 读取响应状态码fmt.Println(Response Status:, resp.Status)// 读取响应体body, err : io.ReadAll(resp.Body)if err ! nil {fmt.Println(Error reading response body:, err)return}// 打印响应体fmt.Println(Response Body:, string(body)) }5. POST请求提交Json数据 有时我们需要发送JSON格式的POST请求。为此我们可以使用encoding/json包将数据结构转换为JSON字符串然后将其作为请求体发送。 客户端 package mainimport (bytesencoding/jsonfmtionet/http )type LoginRequest struct {Username string json:usernamePassword string json:password }func main() {// 创建一个http.Client对象client : http.Client{}// 构建一个LoginRequest对象data : LoginRequest{Username: zhangsan,Password: password,}// 将LoginRequest对象转换为JSON字符串jsonData, err : json.Marshal(data)if err ! nil {fmt.Println(JSON编码失败:, err)return}// 创建一个请求对象req, err : http.NewRequest(POST, http://127.0.0.1:8080/post, bytes.NewBuffer(jsonData))if err ! nil {fmt.Println(创建请求失败:, err)return}// 设置请求头的内容类型为application/jsonreq.Header.Set(Content-Type, application/json)// 发送请求并获取响应resp, err : client.Do(req)if err ! nil {fmt.Println(请求发送失败:, err)return}defer resp.Body.Close()// 读取并处理服务器返回的响应body, err : io.ReadAll(resp.Body)if err ! nil {fmt.Println(读取响应失败:, err)return}fmt.Println(响应状态码:, resp.StatusCode)fmt.Println(响应内容:, string(body)) }服务端 // http_server.go package mainimport (encoding/jsonfmtionet/http )type Result struct {Username string json:usernamePassword string json:password }// 定义发送接收数据函数 func postHandler(resp http.ResponseWriter, req *http.Request) {// 确保处理的是POST请求if req.Method ! POST {http.Error(resp, Invalid request method, http.StatusMethodNotAllowed)return}// 读取请求体中的数据body, err : io.ReadAll(req.Body)if err ! nil {http.Error(resp, Error reading request body, http.StatusInternalServerError)return}defer req.Body.Close()// 打印请求体中的数据fmt.Printf(Received POST request with body: %s\n, string(body))//将json字符串反序列化为原生结构体var result Resultif err : json.Unmarshal(body, result); err ! nil {http.Error(resp, Error parsing request body, http.StatusInternalServerError)}fmt.Println(客户端发来的数据:, result)fmt.Printf(客户端发来的数据:%v\n, result)fmt.Printf(数据类型%T\n, result)// 发送响应给客户端// Received your POST request. This is the response!resp.Write([]byte(服务端接收到数据)) }func main() {// HandleFunc http请求的处理函数// http程序启动之后是不会停止的一直监听请求// 访问这个url就会触发 helloHandler 函数 Request ResponseWriter// func HandleFunc(pattern string, handler func(ResponseWriter, *Request))//第一个参数是请求路径第二个参数是一个函数http.HandleFunc(/post, postHandler)fmt.Println(Starting server at :8080)// func ListenAndServe(addr string, handler Handler) error// ListenAndServe监听TCP地址addr并且会使用handler参数调用Serve函数处理接收到的连接。handler参数一般会设为nil此时会使用DefaultServeMux。//如果用户自定义实现了Handler那么根据相应路径在map中查询到相对应的Handler然后再调用用户自定义的ServeHTTP处理请求。//如果用户没有自定义Handler只注册了对应处理函数(使用了http.HandleFunc)那么就会根据默认DefaultServeMux去map查询到这个函数类型Handler然后再调用ServeHTTP处理函数。// 开启监听程序的代码是放在main方法的最后一行的。if err : http.ListenAndServe(127.0.0.1:8080, nil); err ! nil {fmt.Println(Error starting server:, err)} }运行服务端客户端请求成功服务端拿到json数据。 三、错误处理 在HTTP编程中错误处理是非常重要的。我们需要优雅地处理各种可能的错误如网络错误、解析错误、数据库错误等。 下面是一个简单的错误处理示例。 package mainimport (encoding/jsonfmtlognet/http )type ErrorResponse struct {Error string json:error }func helloHandler(w http.ResponseWriter, r *http.Request) {// 模拟一个错误err : fmt.Errorf(something went wrong)if err ! nil {handleError(w, err)return}fmt.Fprintf(w, Hello, World!) }func handleError(w http.ResponseWriter, err error) {log.Println(Error:, err)w.Header().Set(Content-Type, application/json)w.WriteHeader(http.StatusInternalServerError)json.NewEncoder(w).Encode(ErrorResponse{Error: err.Error()}) }func main() {http.HandleFunc(/, helloHandler)fmt.Println(Starting server at :8080)if err : http.ListenAndServe(:8080, nil); err ! nil {fmt.Println(Error starting server:, err)} }在这个示例中我们定义了一个ErrorResponse结构体用于表示错误响应。然后在helloHandler中我们模拟了一个错误并调用handleError函数来处理该错误。handleError函数记录了错误日志设置了响应头和内容类型并返回了一个JSON格式的错误响应。
http://www.tj-hxxt.cn/news/141490.html

相关文章:

  • 国外做海报的网站正常网站跳出率
  • 山东建设住建厅网站哪些网站设计好
  • 网站开发的对联中国设计在线网站
  • 华为做网站吗wordpress手机页面底部导航栏
  • 百度云服务器挂网站wordpress点击图片直接相册浏览
  • 网站图片地址怎么做的石家庄市网站建设
  • 做兼职写小说网站做代收水果是什么网站
  • 中文网站开发linux WordPress上传插件需要ftp
  • 电商网站seo方案dw博客网站怎么做
  • 甘肃省建设厅执业资格注册中心网站通知浦东新区专业做网站
  • 微信公号嵌入网站开发浅谈博星卓越网站建设
  • 网站建设厘金手指排名二二成都房产网最新楼盘
  • 专业的网站建设企业h5效果展示网站
  • 域名怎么和网站绑定珊瑚绒毯移动网站建设
  • 网页美工设计网站国内网站模板
  • 素材设计做的好的网站有哪些建设工程合同无效的情形有哪些
  • 淘宝的网站建设费用惠城网站建设费用
  • 铜川市建设集团网站企业管理咨询有限公司是干嘛的
  • 如何查找各种网站编程线上课程哪个机构好一些
  • 怎么做网站美工企业融资是做什么的
  • 百度分享wordpress插件东营seo整站优化
  • 全国建设管理信息网站柯桥区建设局网站
  • 连云港网站建设网站江西省住房城乡建设部网站
  • 儿童 网站模板如何做本地门户网站
  • 网站用什么格式做风兰网络
  • 招商加盟网站建设虚拟主机网站源码
  • 用php做的网站前后台模板wordpress socket
  • 企业站手机网站搜索关键词
  • 呼伦贝尔市住房和城乡建设局网站个人做外贸怎么做推广
  • 如何给自己网站做优化阿里巴巴装修网站