Golang中http编程

news2024/11/24 2:23:28

http介绍

编写web语言:
1.java
2.php,现在都在尝试用go语言编写
3.python,豆瓣
4.go语言 ===》 beego,gin两个主流的web框架

https协议:我们使用浏览器访问的时候发送的就是http请求

  1. http是应用层的协议,底层还是依赖传输层:tcp(短链路),网络层(ip)
  2. 无状态的,每一次请求都是独立的,下次请求要重新建立连接
  3. https:
    http是标准协议==》明文传输,不安全
    https不是标准协议==》https = http+ssl(非对称加密,数字证书)-》加密的
    现在所有网站都会尽量要求https开发:安全

http请求报文格式

在这里插入图片描述
一个http请求可以分为4个部分:
1.请求行 2.请求头 3.空行 4.请求包体

http响应消息格式

在这里插入图片描述
http响应格式也分为4部分:

  1. 第一部分:状态行
    协议格式:协议版本号 + 状态码 + 状态描述
    实例1:HTTP/1.1 + 200 + ok
    实例2:HTTP/1.1 + 404 + Page not found
    常用的状态码:
    1xx -> 客户端可以继续发送请求
    2xx-> 正常访问,200
    3xx-> 重定向
    4xx -> 401(未授权) not authorized 404(not found)
    5xx-> Internal Error 服务器内部错误
  2. 第二部分:响应头
    Content-Type:application/json
    Server:Apache
    Data:Mon,12 Sep…
  3. 第三部分:空行
    用于分割,没有响应头了
  4. 第四部分:响应包体
    通常是返回json数据

http响应代码演示

package main 

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

func main() {
	//http包
	client := http.Client{}

	// func (c *Client) Get(url string) (resp *Response,err error){
	resp,err := client.Get("https://www.baidu.com")

	if err != nil{
		fmt.Println("Client.Get err:",err)

		return
	}


	// 放在上边,内容很多
	body := resp.Body
    fmt.Println("body 111:",body)
    // func ReadAll(r io.Reader) ([]byte,error){

	// }
	readBodyStr,err := ioutil.ReadAll(body)
	if err != nil{
		fmt.Println("read body err:",err)
		return
	}

	fmt.Println("body string:",string(readBodyStr))


	ct := resp.Header.Get("Content.Type")
	date := resp.Header.Get("Date")
	server := resp.Header.Get("Server")

	fmt.Println("content-type:",ct)
	fmt.Println("date:",date)
	fmt.Println("server:",server)

	url := resp.Request.URL
	code := resp.StatusCode
	status := resp.Status 

	fmt.Println("url:",url)
	fmt.Println("code:",code)
	fmt.Println("status:",status)
}

http-server代码实现

package main 

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

func main(){
	// 注册路由router
	// xxx/user ===> func1
	// xxx/name ===> func2
	// xxx/id ===> func3
	// https://127.0.0.1:8080/user,func是回调函数,用于路由的响应,这个回调函数原型是固定
	http.HandleFunc("/user",func(writer http.ResponseWriter,request *http.Request){
		// request :===> 包含客户端发来的数据
		fmt.Println("用户请求详情:")
		fmt.Println("request:",request)

		// writer :===> 通过writer将数据返回给客户端
		_,_ = io.WriteString(writer,"这是/user请求返回的数据!")
	})
	http.HandleFunc("/name",func(writer http.ResponseWriter,request *http.Request){
		_,_ = io.WriteString(writer,"这是/name请求返回的数据!")
	})
	http.HandleFunc("/id",func(writer http.ResponseWriter,request *http.Request){
		_,_ = io.WriteString(writer,"这是/id请求返回的数据!")
	})

	fmt.Println("Http Server start ...")
	// func ListenAndServe(addr string,handler Handler) error{
	// http.ListenAndServe()
	if err := http.ListenAndServe("127.0.0.1:8080",nil);err != nil{
		fmt.Println("http start failed,err:",err)
		return
	}

}

JSON编解码案例

package main 

import (
	"fmt"
	"encoding/json"
)

type Student struct{
	Id int 
	Name string
	Age int 
	gender string // 注意:gender是小写的
}

func main(){
	// 在网络中传输的时候,把Student结构体,编码成json字符串,传输 ===》 结构体 ===》 字符串 ==》 编码
	// 接收字符串,需要将字符串转换成结构体,然后操作==》字符串==》结构体==》解密

	lily := Student{
		Id:1,
		Name:"Lily",
		Age:20,
		gender:"女士",
	}

	// 编码(序列化),结构==》字符串
    encodeInfo,err := json.Marshal(&lily)
    if err != nil{
    	fmt.Println("json.Marshal err:",err)
    	return
    }
    fmt.Println("encodeInfo:",string(encodeInfo))

    // 对端接收到数据
    // 反序列化(解码):字符串=》结构体
    var lily2 Student

    // func Unmarshal(data []byte,v interface{}) error {
    if err := json.Unmarshal([]byte(encodeInfo),&lily2);err != nil{
    	fmt.Println("json.Unmarshal err:",err)
    	return
    }

    fmt.Println("name:",lily2.Name)
    fmt.Println("gender:",lily2.gender)
    fmt.Println("age:",lily2.Age)
    fmt.Println("id:",lily2.Id)

}

注意:由于gender在结构体中首字母是小写开头的,json编码不会参与编码

结构体标签(tag)

package main 

import (
	"encoding/json"
	"fmt"
)

type Teacher struct {
	Name string `json:"-"`                        // ==>在使用json编码时,这个编码不参与
	Subject string `json:"Subject_name"`          // ==> 在json编码时,这个字段会编码成Subject_name
	Age int `json:"age,string"`   // ==>在json编码时,将age转成string类型,一定要两个字段:名字,类型,中间不能有空格
	Address string `json:"address,omitempty"` // ==>在json编码时,如果这个字段是空的,那么忽略,不参与编码

	// 注意:gender是小写的,小写字母开头的,在json编码时会会忽略掉
	gender string
}

func main(){

	t1 := Teacher{
		Name:"Duke",
		Subject:"Golang",
		Age:18,
		gender:"Man",
		Address:"北京",
	}

	fmt.Println("t1",t1)
	encodeInfo,_ := json.Marshal(&t1)

	fmt.Println("encodeInfo:",string(encodeInfo))
}

总结
1.对于结构体进行编码时(json),字段的首字母必须大写,否则无法编码
2.如果json格式要求key小写,那么可以通过标签(tag)来解决
3. tag细节

	Name string `json:"-"`                        // ==>在使用json编码时,这个编码不参与
	Subject string `json:"Subject_name"`          // ==> 在json编码时,这个字段会编码成Subject_name
	Age int `json:"age,string"`   // ==>在json编码时,将age转成string类型,一定要两个字段:名字,类型,中间不能有空格

感谢大家观看,我们下次见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文投稿指南——中文核心期刊推荐(地质学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

广告业务系统 之 辅助决策 —— “ AB 实验平台”

文章目录广告业务系统 之 辅助决策 —— “ AB 实验平台”AB 实验平台流量侧 & 渲染侧AB 实验模块架构设计智能流控广告业务系统 之 辅助决策 —— “ AB 实验平台” AB 实验平台 在广告业务中,数据通常作为业务前进的内在驱动力之一。 AB 实验平台就是以实验…

java获取时间并进行计算

前言 SimpleDateFormat使用介绍 提示:以下是本篇文章正文内容,下面案例可供参考 一、SimpleDateFormat是什么? 如果你对java源码比较了解。你会发现java对文字,数字的格式化,是有一个公共的父类的Format。 NumberFo…

.Net Core6.0程序发布到IIS支持apk文件下载

ASP.Net Core6.0 WebApi程序发布到IIS支持apk/wgt文件下载 IIS中配置MIME 添加.apk/.wgtapplication/vnd.android.package-archive或application/octet-stream.Net Core6.0 WebApi 程序要在startup.cs中设置 //使用默认文件 app.UseDefaultFiles(); //开启静态文件 app.UseS…

金山区企业工程技术研究中心给予15万元资金奖励

金山区企业工程技术研究中心一、主管部门金山区科学技术委员会二、政策依据《金山区关于进一步鼓励科技创新加快上海科技创新中心重要承载区建设的若干配套政策》(金府发〔2020〕3号)《金山区关于进一步鼓励科技创新加快上海科技创新中心重要承载区建设的…

赛题发布|“星河杯”隐私计算大赛-赛题发布沙龙成功举办

2023年1月10日下午,由中国信通院与隐私计算联盟主办,中移动信息技术有限公司、联通数字科技有限公司、天翼电子商务有限公司共同协办,FATE开源社区提供技术支持,DataFountain作为官方竞赛平台的“星河杯”隐私计算大赛顺利举办赛题…

Acwing---1212.地宫取宝

地宫取宝1.题目2.基本思想3.代码实现1.题目 X 国王有一个地宫宝库,是 nm 个格子的矩阵,每个格子放一件宝贝,每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或…

SAP入门技术分享三:模块化程序

模块化程序1.子程序概要2.子程序定义3.子程序参数(1)传递参数的方法(2)定义参数类型(3)参数与结构体(4)参数与内表4.调用子程序(1)调用程序内部子程序&#x…

Android APP 缓存路径

Context.getCacheDir():这个缓存路径打印出来的是:data / data / (APPID ) / cacheAndroid系统中的清除APP缓存清除的就是这个路径: 随着用户手动清空缓存或者APP的卸载,这个路径的缓存也会被删除。请注意:在这个缓存路径上读写是不需要请求文…

Qt扫盲-信号槽理论总结

信号槽理论总结一、概述二、信号槽三、信号四、槽函数五、小例子六、 信号槽的默认参数七、高级使用八、 在Qt 里使用第三方的信号槽一、概述 信号和槽用于对象之间的通信。信号和槽机制是Qt的一个核心特性,也是与其他框架所提供的特性最大不同的部分。Qt的元对象系…

win10跨网段文件共享

win10跨网段文件共享问题描述问题分析网络可达性防火墙权限问题操作网络拓扑示意图操作步骤问题描述 平常,我们经常用的是同一局域网下的网络共享,这在windows上很容易操作。现在,两台PC主机不在同一子网,该如何共享?…

【C/C++】静态顺序表详解(附完整源码)

本章内容 1.什么是线性表 2.什么是顺序表 3.静态顺序表结构的定义 4.静态顺序表的函数接口实现 5.静态顺序表的问题及思考 1.什么是线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&…

开源飞控初探(四)ArduPilot::Copter固件源码分析

2022.5.7,基于v4.0.5的分析。官网文档没及时更新,本文对当前版本源码的描述可能和官网不一样。1、无人机全栈分层结构图2、Flight Code固件部分上图中的Flight Code层,分为5个部分:车机层。一份代码通过编译配置,可以支…

行转列,动态列枚举分组

【问题】Hi All,Thanks for the wonderful support the community gets from this forum.I am trying to accomplish this in MongoDB. Didn’t think it could get this complicated. thought the problem was interesting to solve.I am trying to get a count of students b…

【库函数】-还在为操作字符串而烦恼,一篇带你解决这样的烦恼,这里详细介绍关于字符串操作的各个库函数,以及模拟实现

🎇作者:小树苗渴望变成参天大树 🎉作者宣言:认真写好每一篇博客 💥作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 字符函数和字符串函数💦前言&…

python函数定义中的/和*的作用

python函数定义中的/和*的作用 特殊参数https://docs.python.org/zh-cn/3/tutorial/controlflow.html#special-parameters 函数定义中的单独出现的/和*的作用 / 和 * 是可选的。 /用来指明他前面的函数形参必须使用位置参数。 *用来指明他后面的函数形参必须为关键字参数的…

儿童感染新冠后怎么用药?什么情况需要就医?

儿童感染新冠病毒的症状,病程有哪些特点?退烧药怎么选,怎么吃?孩子有什么症状需要立即就医?...01儿童感染新冠病毒的症状,病程有哪些特点?王泉:儿童是新冠病毒的易感人群。新冠病毒感…

Unity C#热更新框架ILRuntime接入

简介 ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速、方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新 官方教程 https://ourpalm.github.io/ILRunt…

揭开 TLS 握手的神秘面纱:它是什么以及它是如何工作的

传输层安全性 (TLS) 旨在为网络通信增加安全性。 就是浏览互联网时HTTP和HTTPS的区别。 使用 TLS 为客户端和服务器增加了额外的工作,但它有其好处,包括: 机密性:TLS 将流量包装在加密隧道中。 这使得窃听者不可能在到达目的地的…

[Swift]UIView抖动动画

以拨打视频电话时的拨打按钮抖动为例 import UIKitclass PACallPrepareAlertView: UIView {IBOutlet weak var callIV: UIImageView!private var isLeave: Bool falsedeinit {isLeave true}override func awakeFromNib() {super.awakeFromNib()shakeAction()}private func s…