首页 > 编程语言 >狂神说Go语言—Go语言Http编程

狂神说Go语言—Go语言Http编程

时间:2023-01-05 23:34:02浏览次数:57  
标签:http 语言 fmt request Println Go 服务器 狂神 请求

web开发基础知识

静态web与动态web

web:网页

静态web:

  • html、css
  • 提供给所有的人数据不会发生变化

动态web:

  • 淘宝、京东几乎所有的网站
  • 提供给所有人的数据始终会发生变化、每个人在不同的时间内、不同的地点看到的信息也不同

web应用程序

可以提供浏览器访问的程序

服务器---网络请求

url https://www.kuangstudy.com/ ---解析:ip地址 服务器

你们能访问到的任何一个页面和资源,都存在于这个世界的某一个角落的计算机上

什么是HTTP

HTTP(超文本传输协议)请求---响应

  • 文本:html、字符串......
  • 超文本:图片、视频、音乐、地图......
  • 端口:80

https: s==ssl,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性

  • 443

http请求响应

客户端 ---> 发送请求Request---> 服务端 https://www.baidu.com

  • 请求方式:get
  • 请求方式:Get,Post ,head、delete、put、tract
    • get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
    • post:请求能够携带的参数没有限制,大小没有限制,不会再浏览器的URL地址栏显示数据内容,安全,但不高效

响应:

  • 服务器---> 响应Request---> 客户端

  • 数据格式

    • 网页
    • json
    • 文本
    • 文件
    • ......
  • 状态码

    • 200

    • http.StatusOK= 200成功连接访问。
      http.StatusFound = 302页面跳转的状态码。
      http.StatusBadRequest = 400非法请求,服务端无法解析。

      http.StatusUnauthorized = 401权限受限,未通过。
      http.StatusForbidden = 403禁止访问。
      http.StatusNotFound = 404请求页面不存在。
      http.StatuslnternalServerError = 500服务器内部错误。|

web应用程序工作流程

Web服务器的工作原理可以简单地归纳为:

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

HTTP编程

Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现

image-20230105174405795

image-20230105174451201

package main

import (
   "fmt"
   "net/http"
)

func main() {
   //请求处理HandleFunc
   http.HandleFunc("/hello", hello)
   //端口ListenAndServe
   http.ListenAndServe("localhost:8080", nil) //端口号为localhost:8080,服务器为nil表示默认,用handler服务器
}
func hello(writer http.ResponseWriter, request *http.Request) {
   //可以打印输出请求的信息
   fmt.Println(request.URL)
   fmt.Println(request.Method)     //请求的方法
   fmt.Println(request.RemoteAddr) //请求的地址
   fmt.Println("程序被访问到了....")

   // 也可以写入信息
   writer.Write([]byte("heelo,学相伴"))
}
package main

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

func main() {
   //获取Get
   response, _ := http.Get("http://localhost:8080/hello")
   defer response.Body.Close()
   // 请求和响应存储的数据Body,读取信息Read
   buf := make([]byte, 1024) //创建一个切片用于读取信息

   // for打印输出
   for {
      n, erro := response.Body.Read(buf)
      if erro != nil && erro != io.EOF {
         fmt.Println(erro)
         return
      } else {
         fmt.Println("读取到的信息", string(buf[:n])) //将从0:n接受的数字信息转换为string字符
         break
      }
   }
}

带参数的请求

关于GET的参数需要使用GO语言内置的net/url这个标准库来处理

http.HandleFunc("/login", login)
func login(writer http.ResponseWriter, request *http.Request) {
   //获取用户传递过来的数据
   data := request.URL.Query()
   username := data.Get("username")
   password := data.Get("password")
   fmt.Println("username", "password", username, password)
   //响应信息给客户端
   writer.Write([]byte(`{"登录状态:ok"}`))
}
package main

import (
   "fmt"
   "io"
   "net/http"
   "net/url"
)

func main() {
   //定义请求的数据 urlstr
   urlstr := "http://localhost:8080/login"
   // 拼接参数valuses
   data := url.Values{}
   data.Set("username", "kuangshenshuo")
   data.Set("password", "123456")

   // 解析url:ParseRequestURI
   rurl, _ := url.ParseRequestURI(urlstr)
   //RawQuery数据绑定 ,Encode可以将编码转换为string
   rurl.RawQuery = data.Encode()
   // 发送请求
   resp, _ := http.Get(rurl.String())
   // 读取方式选择io下的ReadAll
   b, _ := io.ReadAll(resp.Body)
   fmt.Println(string(b))
}

处理前端表单数据

编写注册表单

package main

import (
   "fmt"
   "net/http"
)

func main() {
   //请求处理HandleFunc

   http.HandleFunc("/register", register)
   //端口ListenAndServe
   http.ListenAndServe("localhost:8080", nil) //端口号为localhost:8080,服务器为nil表示默认,用handler服务器
}
func register(writer http.ResponseWriter, request *http.Request) {
   request.ParseForm()
   fmt.Println(request.ParseForm())
   username := request.PostForm.Get("username")
   password := request.PostForm.Get("password")
   fmt.Println("username:", username, "password:", password)
   //响应信息给客户端
   writer.Write([]byte(`{"登录状态:ok"}`))
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册表单</title>
</head>
<body>
<form action="http://localhost:8080/register" method="post">
    <p>
  用户名:<input type="text" name="username">
    </p>
    <p>
    密码:<input type="password" name="password">
    </p>

    <input type="submit" value="提交">
</form>

</body>
</html>

响应页面

模板文件中使用{{和}}包裹和标识需要传入的数据。
传给模板这样的数据就可以通过点号(.)来访问,如果数据是复杂类型的数据,可以通过( (.FieldName })来访问它的字段。

除{{和}}包裹的内容外,其他内容均不做修改原样输出。
如果要传入多个参数,一般都使用map 或者struct类型。

标签:http,语言,fmt,request,Println,Go,服务器,狂神,请求
From: https://www.cnblogs.com/DuPengBG/p/17029131.html

相关文章

  • 最新go语言学习教程
    go语言学习教程集合了连接goroutine、go连接redis、go连接kafka等示例,所有代码均经过实践,可以直接使用https://github.com/fastbpmn/go-studyTRANSLATEwithxE......
  • golang 打隧道和端口转发
    `packagemainimport("golang.org/x/crypto/ssh""io""log""net")//main万物的起源funcmain(){sshAddr:="000.00.000.00:22"//服务器的ip:ssh端口sshUs......
  • C语言学院教职员工信息管理系统
    C语言学院教职员工信息管理系统学院教职员工信息管理系统课程设计题目(二):用C语言实现学院教职员工信息管理系统,主要功能与要求包括:1.信息库中包括每一位教师的职工......
  • golang连接mysql操作示例增删改查
    golang本身没有提供连接mysql的驱动,但是定义了标准接口供第三方开发驱动。这里连接mysql可以使用第三方库,第三方库推荐使用https://github.com/Go-SQL-Driver/MySQL这个驱动......
  • golang go-sql-drive mysql连接池的实现
    ​​http://www.01happy.com/golang-go-sql-drive-mysql-connection-pooling/​​golang内部自带了连接池功能,刚开始接触golang的时候不了解这个,还自己搞了一个sql.Open的......
  • golang中tcp socket粘包问题和处理
    ​​http://www.01happy.com/golang-tcp-socket-adhere/​​在用golang开发人工客服系统的时候碰到了粘包问题,那么什么是粘包呢?例如我们和客户端约定数据交互格式是一个json......
  • 关于C语言库函数qsort的学习
    #include<stdio.h>#include<stdlib.h>#include<string.h>structStu{charname[20];intage;};//voidqsort(void*base,//size_tnum,//size_twidth,//int(*cmp......
  • linux 下 mongodb 安装
    linux下mongodb安装地址https://www.mongodb.com/try/download/community选择版本和环境需要下载2个包,mongod和shellpackage选择service复制链接,再选择sh......
  • 1009.Django模型基础04
    一、数据库数据渲染到模板二、案例的功能介绍博客小案例功能介绍:主页index.html-------------->展示添加博客和博客列表的文字,实现页面跳转添加页add.html----------......
  • 1008.Django模型基础03
    一、关系表的数据操作关系表中的数据操作查看数据库中的表结构   一对多表关系数据的添加:1.第一种方式就是跟之前一样,用传参的方法添加,需要注意的是外键的值必......