[云原生] Go web工作流程

简介: [云原生] Go web工作流程

web工作流程

  • Web服务器的工作原理可以简单地归纳为
  • 客户机通过TCP/IP协议建立到服务器的TCP连接
  • 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档
  • 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端
  • 客户机与服务器断开。由客户端解释HTML文档,在客户端屏幕上渲染图形结果

HTTP协议

  • 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,它详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议
  • HTTP协议通常承载于TCP协议之上
    talk is cheap , show me the code
package main

import (
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
)

func main() {
  //http://127.0.0.1:8000/go
  // 单独写回调函数
  http.HandleFunc("/go", myHandler)
  // addr:监听的地址
  // handler:回调函数
  http.ListenAndServe("127.0.0.1:8000", nil)
}

// handler函数
func myHandler(w http.ResponseWriter, r *http.Request) {
  fmt.Println(r.RemoteAddr, "连接成功")
  // 请求方式:GET POST DELETE PUT UPDATE
  fmt.Println("method:", r.Method)
  // /go
  fmt.Println("url:", r.URL.Path)
  fmt.Println("header:", r.Header)
  fmt.Println("body:", r.Body)
  // 回复
  switch r.Method {
  case "GET":
    {
      w.Write([]byte("get"))
    }
  case "POST":
    {
      // 读取body内容
      content, err := ioutil.ReadAll(r.Body)
      if err != nil {
        log.Println("read post body occurs error: ", err)
      }
      fmt.Println("post body:", string(content))
      w.Write([]byte("post"))
    }
  default:
    {
      w.Write([]byte(r.Method))
    }
  }
  fmt.Println("end---")
}

package main

import (
  "encoding/json"
  "fmt"
  "io"
  "log"
  "net/http"
  "strings"
)

type Data struct {
  Name string `json:"name"`
  Age  int8   `json:"age"`
}

func main() {
  //resp, _ := http.Get("http://www.baidu.com")
  //fmt.Println(resp)
  resp, _ := http.Get("http://127.0.0.1:8000/go")
  ResponseHandler(resp)
  fmt.Println("----")

  data := &Data{
    Name: "hello",
    Age:  18,
  }

  // 转换成json格式
  data_json, err := json.Marshal(data)
  if err != nil {
    log.Println("json.Marshaler error: ", err)
  }
  fmt.Println(string(data_json))
  resp, _ = http.Post("http://127.0.0.1:8000/go", "application/json", strings.NewReader(string(data_json)))
  ResponseHandler(resp)
}

func ResponseHandler(resp *http.Response) {
  defer resp.Body.Close()
  // 200 OK

  fmt.Println(resp.Status)
  fmt.Println(resp.Header)

  buf := make([]byte, 1024)
  for {
    // 接收服务端信息
    n, err := resp.Body.Read(buf)
    if err != nil && err != io.EOF {
      fmt.Println(err)
      return
    } else {
      fmt.Println("读取完毕")
      res := string(buf[:n])
      fmt.Println(res)
      break
    }
  }
}

结果

> go run .\server.go
127.0.0.1:54856 连接成功
method: GET
url: /go
header: map[Accept-Encoding:[gzip] User-Agent:[Go-http-client/1.1]]
body: {}
end---
127.0.0.1:54856 连接成功
method: POST
url: /go
header: map[Accept-Encoding:[gzip] Content-Length:[25] Content-Type:[application/json] User-Agent:[Go-http-client/1.1]]
body: &{0xc0000b6048 <nil> <nil> false true {0 0} false false false 0x475080}
post body: {"name":"hello","age":18}
end---

> go run .\client.go
200 OK
map[Content-Length:[3] Content-Type:[text/plain; charset=utf-8] Date:[Mon, 25 Apr 2022 17:17:31 GMT]]
读取完毕
get
----
{"name":"hello","age":18}
200 OK
map[Content-Length:[4] Content-Type:[text/plain; charset=utf-8] Date:[Mon, 25 Apr 2022 17:17:31 GMT]]
读取完毕
post

http handler的格式模板

// HandleFunc registers the handler function for the given pattern
// in the DefaultServeMux.
// The documentation for ServeMux explains how patterns are matched.
func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
  DefaultServeMux.HandleFunc(pattern, handler)
}
相关文章
|
4月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
27天前
|
中间件 Go API
Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架
本文概述了Go语言中几种流行的Web框架,如Beego、Gin和Echo,分析了它们的特点、性能及适用场景,并讨论了如何根据项目需求、性能要求、团队经验和社区支持等因素选择最合适的框架。
70 1
|
1月前
|
缓存 前端开发 中间件
go语言中Web框架
【10月更文挑战第22天】
44 4
|
2月前
|
SQL 关系型数据库 数据库
优化Web开发流程:Python ORM的优势与实现细节
【10月更文挑战第4天】在Web开发中,数据库操作至关重要,但直接编写SQL语句既繁琐又易错。对象关系映射(ORM)技术应运而生,让开发者以面向对象的方式操作数据库,显著提升了开发效率和代码可维护性。本文探讨Python ORM的优势及其实现细节,并通过Django ORM的示例展示其应用。ORM提供高级抽象层,简化数据库操作,提高代码可读性,并支持多种数据库后端,防止SQL注入。Django内置强大的ORM系统,通过定义模型、生成数据库表、插入和查询数据等步骤,展示了如何利用ORM简化复杂的数据库操作。
65 6
|
3月前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
4月前
|
Cloud Native JavaScript API
一文读懂云原生 go-zero 微服务框架
一文读懂云原生 go-zero 微服务框架
|
4月前
|
开发者 Java Spring
JSF 牵手社交登录,如魔法风暴席卷 Web 世界,开启震撼便捷登录之旅!
【8月更文挑战第31天】在互联网时代,便捷登录成为用户的核心需求。社交登录凭借其便捷性、安全性和社交化的特点,在各类Web应用中广泛应用。JavaServer Faces(JSF),作为一款流行的Java Web框架,能够轻松集成社交登录功能,显著提升用户体验。本文详细介绍社交登录的优势,并提供两种JSF集成社交登录的常见方法:一是利用Spring Social等第三方库简化开发;二是自行实现社交登录流程。开发者可根据项目需求选择适合的方案。
49 0
|
4月前
|
算法 测试技术 Go
|
4月前
|
数据采集 前端开发 开发者
Angular表单控件详解:掌握模板驱动与响应式表单的精髓,让Web应用中的数据采集工作变得高效又简单,彻底告别繁琐的表单处理流程
【8月更文挑战第31天】表单是 Web 应用的关键组件,用于用户登录、注册及信息提交。Angular 作为成熟前端框架,提供了强大的表单处理功能,包括模板驱动与响应式表单。本文通过技术博客形式,详细介绍这两种表单控件,并提供示例代码,展示如何利用它们简化表单处理流程,提高开发效率。首先介绍简单的模板驱动表单,然后讲解基于 RxJS 的响应式表单,适用于复杂逻辑。通过本文,你将学会如何高效地使用 Angular 表单控件,提升应用的用户体验。
48 0
|
4月前
|
JSON 数据库 开发者
FastAPI入门指南:Python开发者必看——从零基础到精通,掌握FastAPI的全栈式Web开发流程,解锁高效编码的秘密!
【8月更文挑战第31天】在当今的Web开发领域,FastAPI迅速成为开发者的热门选择。本指南带领Python开发者快速入门FastAPI,涵盖环境搭建、基础代码、路径参数、请求体处理、数据库操作及异常处理等内容,帮助你轻松掌握这一高效Web框架。通过实践操作,你将学会构建高性能的Web应用,并为后续复杂项目打下坚实基础。
139 0