golang之net/http模块学习

文章目录

      • 开启服务
      • 开启访问静态文件
      • 获取现在时间
      • 按时间创建一个空的json文件
        • 按时间创建一个固定值的json文件
      • 跨域请求处理
      • 输出是json

开启服务

package main

import (
	"fmt"
	"net/http"
)

//路由
func handler(w http.ResponseWriter, r *http.Request){
	fmt.Fprintf(w, "hello World!")
}

func main(){
	//路由
	http.HandleFunc("/", handler)
  	//开启服务
	http.ListenAndServe(":8091", nil) //port:8091(自定义,注意:要是空闲端口)
}
#启动服务
go run main.go

这样本地的8091端口就可以访问了

开启访问静态文件

我们这里拿video来举例

在这里插入图片描述

package main

import (
  "fmt"
  "net/http"
)

func main(){
  	//静态文件访问
	fs := http.FileServer(http.Dir("./assets"))
	http.Handle("/static/", http.StripPrefix("/static/", fs))
	//开启服务
	http.ListenAndServe(":8091", nil)
}

按照图上的访问路径(http://localhost:8091/static/video/20231204-134423.mp4)

获取现在时间

package main

import (
  "fmt"
  "time"
)

func main(){
	currentTime := time.Now()
	fmt.Println("当前的时间为",currentTime)
}

因为currentTime是time.Time类型所以要想页面输出要进行字符串转换

//获取时间
func getNowTime(w http.ResponseWriter, r *http.Request){
	currentTime := time.Now()
	timeString := currentTime.Format("2006-01-02 15:04:05")//"2006-01-02 15:04:05"只是时间格式化字符串格式
	fmt.Fprintf(w,timeString)
}

至于这个函数上面命名也是如此,就当是net/http路由服务的固定格式便好
注意: Golang函数首字符大写代表着公开(public)小写代表着私有(private)

按时间创建一个空的json文件

package main

import (
	"fmt"
	"time"
//	"encoding/json"
	"os"
)

func CreateFileNil(){
	currentTime := GetTime()
	fileName := currentTime.Format("2006-01-02_15-04-05") + ".json"
	file,err := os.Create("./assets/json/"+fileName)
	if err != nil {
		fmt.Println("JSON编码失败:", err)
		return
	}
	defer file.Close() //defer:表示函数的最后执行(这里是确保最后文件是关闭的)
}

func main(){
	CreateFileNil()
}
按时间创建一个固定值的json文件
package main

import (
	"fmt"
	"time"
	"encoding/json"
	"os"
)

type Person struct {
	Name string
	Age int
}
//创建一个固定值的json文件
func CreateFileGuDin(){
	currentTime := GetTime()
	fileName := currentTime.Format("2006-01-02_15-04-05") + ".json"
	file,err := os.Create("./assets/json/"+fileName)
	if err != nil {
		fmt.Println("JSON编码失败:", err)
		return
	}
	defer file.Close()
	
	person := Person{Name: "Alice", Age: 25}
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("JSON编码失败:", err)
		return
	}

	_, err = file.Write(jsonData)
	if err != nil {
		fmt.Println("写入文件失败:", err)
		return
	}

	fmt.Println("JSON文件创建成功:", fileName)
}

func main(){
  CreateFileGuDin()
}

跨域请求处理

package main

import (
	"fmt"
	"net/http"
)

//路由
func handler(w http.ResponseWriter, r *http.Request){
	fmt.Fprintf(w, "hello World!")
}

func main(){
	//创建一个处理跨域请求的处理器函数
	corsHandler := func(h http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			// 设置允许跨域的域名
			w.Header().Set("Access-Control-Allow-Origin", "*")
			// 允许的请求方法
			w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
			// 允许的请求头
			w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
			// 如果是预检请求,直接返回
			if r.Method == "OPTIONS" {
				return
			}
			h.ServeHTTP(w, r)
		})
	}
	//路由
	http.Handle("/", corsHandler(http.HandlerFunc(handler)))

	//开启服务
	http.ListenAndServe(":8091", nil)
}

输出是json

package main

import (
  "fmt"
  "net/http"
  "encoding/json"
)

type FileDetail struct{
  NowTime string `json:"now_time"`
  FileName string `json:"file_name"`
}

func func_name1(w http.ResponseWriter, r *http.Request){
  responseData := FileDetail {NowTime:"2023_12_04_22_51_30.json",FileName:"http://"+local+":" + port + "/static/video/20231204-19.mp4"}
  w.Header().Set("Content-Type", "application/json")
  w.WriteHeader(http.StatusOK)
  json.NewEncoder(w).Encode(responseData)
}

func main(){
  //创建一个处理跨域请求的处理器函数
	corsHandler := func(h http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			// 设置允许跨域的域名
			w.Header().Set("Access-Control-Allow-Origin", "*")
			// 允许的请求方法
			w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
			// 允许的请求头
			w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
			// 如果是预检请求,直接返回
			if r.Method == "OPTIONS" {
				return
			}
			h.ServeHTTP(w, r)
		})
	}
    
    http.Handle("/test", corsHandler(http.HandlerFunc(func_name1)))
    //开启服务
	http.ListenAndServe(":8091", nil)
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过网线连接的局域网电脑怎么实现上网功能

在机床里面的工控机有时候需要进行联网操作,但是又没有无线网或者外网网线,这时候可以通过笔记本的无线wifi功能实现上网功能. 通过网络适配器-找到wifi对应适配器-共享-1 打勾-2选中与工控机连接的网口-既可. 工控机端,将网口设置为自动获取IP

.NET Core6.0 MVC+layui+SqlSugar 简单增删改查

HTML部分: {ViewData["Title"] "用户列表"; } <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>用户列表</title><meta name"renderer" content"webkit"><meta …

DevOps搭建(三)-Git安装详细步骤

前面两篇文章我们讲了如何安装swappiness安装和虚拟机。这篇我们详细讲下如何安装Git。 1、YUM源更改为阿里云镜像源 1.1、备份CentOS-Base.repo 先备份原有的 CentOS-Base.repo 文件 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup…

C# 热键注册工具类

写在前面 介绍一个验证过的热键注册工具类&#xff0c;使用系统类库user32.dll中的RegisterHotkey函数来实现全局热键的注册。 代码实现 [Flags]public enum KeyModifiers{Alt 1,Control 2,Shift 4,Windows 8,NoRepeat 0x4000}public static class HotKeyHelper{[DllImp…

十五、机器学习进阶知识:K-Means聚类算法

文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类&#xff08;Clustering&#xff09;是指将不同…

菜鸟学习日记(python)——运算符

我们进行运算时&#xff0c;需要两类数据&#xff0c;操作数和运算符&#xff0c;例如&#xff1a;ab就是一个运算&#xff0c;它的操作数是a和b&#xff0c;运算符是‘’ 在python中运算符包括以下几大类&#xff1a; 算数运算符比较&#xff08;关系&#xff09;运算符赋值…

【云原生 | Docker】Docker核心概念 应用上手最佳流程

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

ubuntu 下载编译 opencv4.2.0并检验

如有帮助点赞收藏关注&#xff01; 如需转载&#xff0c;请注明出处&#xff01; ubuntu 的opencv4.2.0下载与编译 下载依赖开始编译安装配置OpenCV编译环境检验* 完成 下载 首先下载opencv源码网址&#xff1a; https://opencv.org/releases/page/3/ 下载成zip后&#xff0c;…

Linux常用快捷键

1. tab 键补全 1)当我们忘记了一些指令怎么写时&#xff0c;可以双击tab键&#xff0c;查看所有指令&#xff0c;显示出来后可以按enter键往下翻&#xff0c;想要取消命令可以按ctrl c。 2)知道开头怎么写&#xff0c;后面的忘了&#xff0c;也可以双击tab键查询开头排列的指令…

Liunx系统使用超详细(三)

本篇内容开始逐渐描述有关liunx的各种命令的使用方法&#xff01; 目录 一、目录和文件区别 1.1目录&#xff1a; 1.2文件&#xff1a; 1.3总结&#xff1a; 二、Linux命令的写法 三、linux命令清屏 四、pwd命令 五、ls命令 5.1 ls&#xff1a; 5.2 ls -l&#xff1a…

HTML CSS JavaScript的网页设计

一、网页界面效果&#xff1a; 二、HTML代码&#xff1a; <!DOCTYPE html> <!-- 声明文档类型--> <html lang"en"> …

代码随想录第二十一天(一刷C语言)|回溯算法组合

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、回溯算法 1、种类 排列、组合、分割、子集、棋盘问题 2、回溯步骤 &#xff08;0&#xff09;回溯抽象 回溯法解决的问题均可以抽象为树形结构&#xff08;N叉树&#xff09; &…

acwing-Linux学习笔记

acwing-Linux课上的笔记 acwing-Linux网址 文章目录 1.1常用文件管理命令homework作业测评命令 2.1 简单的介绍tmux与vimvimhomeworktmux教程vim教程homework中的一些操作 3 shell语法概论注释变量默认变量数组expr命令read命令echo命令printf命令test命令与判断符号[]逻辑运算…

等保测评报价相差很大,里面有什么门道

等保测评报价的差异主要源于以下几点&#xff1a; 服务质量评估标准不同&#xff1a;不同的测评机构在测评过程中所提供的服务范围、深度、细节等方面可能存在差异&#xff0c;因此导致报价有所不同。一些机构可能提供全面且细致的测评服务&#xff0c;致力于提供高质量的等保测…

Nested Named Entity Recognition with Span-level Graphs

原文链接&#xff1a; https://aclanthology.org/2022.acl-long.63.pdf ACL 2022 介绍 问题 基于span的方法虽然在解决嵌套实体上存在巨大潜力&#xff0c;但存在以下问题&#xff1a; 1&#xff09;难以充分利用span的丰富语义&#xff1b; 2&#xff09;重叠较多的正负样本会…

如何使用PostMan进行并发测试?

如何使用PostMan进行并发测试&#xff1f; &#x1f440;(Postman 的 runner 实际上是串行执行的&#xff0c;因此不能作为并发测试&#xff0c; 只是批量测试&#xff0c;本文如下称为并发的是错误的) 文章目录 如何使用PostMan进行并发测试&#xff1f;POST篇流程Pre-req 脚…

c++ atmoic acquire/release

由于多核cpu缓存的存在&#xff0c;以及gcc编译优化&#xff0c;cpu指令层面的优化&#xff0c;导致程序的执行顺序可能跟你写的顺序不完全一致&#xff08;reorder&#xff09;。 但是在多线程编程中如何确保各个线程能正确的读取到各个变量呢&#xff08;而不是cache中老旧的…

做一件荒谬的事:用AI推理下一次双色球结果 v0.1

做一件荒谬的事&#xff1a;用AI推理下一次双色球结果 v0.1 引言 事情的起因是父亲被亲戚安利&#xff0c;突然喜欢上了双色球&#xff0c;连规则和开奖结果怎么看都不懂的他&#xff0c;让我研究研究这个事&#xff0c;给他选个号。他还说老家有好几个人中了几百万&#xff…

3.C程序编译步骤

目录 1 预处理 2 编译 3 汇编 4 链接 5 文件大小情况 依次执行下面4个步骤 预处理 将所有头文件展开&#xff0c;比如stdio.h等&#xff0c;展开就相当于把stdio.h中的所有代码粘贴到你的代码里。将所有的宏文件展开&#xff0c;像stdio.h是官方定义的头文件&#x…

Batch Normalization

1.是什么&#xff1f; 批量归一化&#xff08;Batch Normalization&#xff09;&#xff0c;由Google于2015年提出&#xff0c;是近年来深度学习&#xff08;DL&#xff09;领域最重要的进步之一。该方法依靠两次连续的线性变换&#xff0c;希望转化后的数值满足一定的特性&am…