转载请注明出处:

  net/http是Go语言标准库中的一个包,提供了实现HTTP客户端和服务器的功能。它使得编写基于HTTP协议的Web应用程序变得简单和方便。

  net/http包的主要用途包括:

  1. 实现HTTP客户端:可以发送HTTP请求并接收服务器的响应。

  2. 实现HTTP服务器:可以创建一个HTTP服务器,接受客户端的请求并返回响应

1.实现HTTP客户端

1.1发送GET请求:

package main

import (
"fmt"
"io/ioutil"
"net/http"
) func main() {
// 发送GET请求
resp, err := http.Get("https://www.baidu.com")
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close() // 读取响应内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应失败:", err)
return
} fmt.Println("响应内容:", string(body))
}

  上面使用http.Client创建了一个HTTP客户端对象,并通过其Get方法发送了一个GET请求。然后通过ioutil.ReadAll方法读取响应的内容,并打印出来。

  其运行之后结果如下:

1.2 发送POST请求

package main

import (
"fmt"
"io/ioutil"
"net/http"
"strings"
) func main() {
// POST请求数据
payload := strings.NewReader("name=John&age=30") // 发送POST请求
resp, err := http.Post("https://api.example.com/submit", "application/x-www-form-urlencoded", payload)
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close() // 读取响应内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应失败:", err)
return
} fmt.Println("响应内容:", string(body))
}

  通过http.Post方法发送了一个POST请求,并从响应中读取了内容。需要注意的是,第二个参数指定了请求的Content-Type为application/x-www-form-urlencoded,并且通过strings.NewReader创建了请求体。

1.3自定义请求

package main

import (
"fmt"
"io/ioutil"
"net/http"
) func main() {
// 创建一个自定义请求
req, err := http.NewRequest("GET", "https://api.example.com/data", nil)
if err != nil {
fmt.Println("创建请求失败:", err)
return
} // 可以设置请求头部信息
req.Header.Add("Authorization", "Bearer token123") // 发送自定义请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close() // 读取响应内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应失败:", err)
return
} fmt.Println("响应内容:", string(body))
}

  上面首先使用http.NewRequest方法创建了一个自定义的GET请求,然后可以通过req.Header.Add方法设置请求头部信息。最后使用client.Do方法发送自定义请求,并从响应中读取内容。

2.HTTP服务器

2.1创建HTTP服务器:

// 定义处理器函数
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
} // 注册处理器函数
http.HandleFunc("/", helloHandler) // 启动HTTP服务器
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("Server error:", err)
}

  上面定义了一个处理器函数helloHandler,该函数对所有的HTTP请求都返回"Hello, World!"。使用http.HandleFunc方法将处理器函数注册到根路径"/"上。然后通过http.ListenAndServe方法启动了一个监听在端口8080的HTTP服务器。

  当有客户端请求到达时,服务器会调用相应的处理器函数来处理请求并返回响应。

2.2 实现路由

  在net/http中,路由是指根据不同的URL路径来匹配和执行相应的处理函数。通过路由,我们可以将不同的URL请求映射到不同的处理逻辑上。

  net/http包提供了http.HandleFunchttp.Handle两个方法用于注册路由处理函数。

  1. http.HandleFunc方法:

    http.HandleFunc方法允许我们直接指定一个处理函数来处理特定的URL路径。示例代码如下:

// 定义处理函数
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
} // 注册处理函数
http.HandleFunc("/hello", helloHandler)

  上面定义了一个处理函数helloHandler,当客户端请求路径为"/hello"时,服务器会调用该函数进行处理并返回"Hello, World!"。

  2. http.Handle方法:

  http.Handle方法允许我们使用自定义的处理器类型来实现更灵活的路由功能。示例代码如下:

// 定义自定义处理器类型
type MyHandler struct{} // 实现处理器接口的ServeHTTP方法
func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Custom Handler")
} // 创建自定义处理器对象
myHandler := &MyHandler{} // 注册处理器
http.Handle("/custom", myHandler)

  上面定义了一个自定义处理器类型MyHandler,并在该类型上实现了ServeHTTP方法。当客户端请求路径为"/custom"时,服务器会调用ServeHTTP方法来处理请求并返回"Custom Handler"。

Go中 net/http 使用的更多相关文章

  1. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  2. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  3. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  4. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  5. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  6. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  7. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  8. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  9. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  10. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

随机推荐

  1. DFS(深度优先搜索) 总是需要重置 visited 的状态吗?

    问题来自 P1902 刺杀大使,在最初的实现中 DFS 中一段代码如下: visited[x2][y2] = true; flag = dfs(v, x2, y2); visited[x2][y2] ...

  2. SQL Server数据库判断最近一次的备份执行结果

    1 麻烦的地方 在SQL Server的官方文档里面可以看到备份和还原的表,但是这些表里面只能找到备份成功的相关信息,无法找到备份失败的记录,比如msdb.dbo.backupset.对于一些监控系统 ...

  3. TCP/IP网络模型

    在网络模型中有分为7层模型(OSI模型)和5层模型和TCP/IP模型 OSI模型将应用层和表示层作为独立的两层,而TCP/IP模型将它们合并为一个应用层. 两种对比来说,TCP/IP模型更符合实际开发 ...

  4. 2步打通ModelArts和Astro,实现AI应用快速落地

    摘要:本文以 ModelArts 的"找云宝"自动学习 AI 应用为例,结合低代码平台 Astro 轻应用快速实现一个"找云宝"小应用. 本文分享自华为云社区& ...

  5. vue全家桶进阶之路38:Vue3 组件内部路由守卫

    在 Vue Router 中,可以为路由和路由组件注册全局的路由守卫,也可以在组件内部注册路由守卫. 组件内部的路由守卫有以下几种: beforeRouteEnter:在路由进入组件前被调用,但是在组 ...

  6. 2023.5.16 总结 AT_abc260_g

    atcoder AT_abc260_g 题意 一个点 O 可以影响到其它点,能影响到的点的坐标满足:(\((u, v)\) 为当前点的坐标,\((x, y) 为能影响到的点的坐标\)) \(u\le ...

  7. Weblogic反序列化(CVE-2023-21839)漏洞复现

    前言 序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程,一般将对象转换为字节流.序列化时,对象的当前状态被写入到临时或持久性存储区(文件.内存.数据库等). 反序 ...

  8. 让你的 conda “回滚”到以前版本的环境

    我现在使用 Anaconda 作为我的主要 Python 发行版,同样,我们公司也将它用于所有开发人员机器以及他们的服务器.然而,前几天我在浏览一些论坛技术文章时遇到了一个我以前从未知道的 conda ...

  9. 【2023 · CANN训练营第一季】昇腾AI入门Pytorch

    昇腾AI全栈架构 华为AI全栈全场景解决方案为4层,分别为芯片层.芯片使能层.AI框架层和应用使能层. 芯片 基于统一.可扩展架构的系列化AI IP和芯片,为上层加速提供硬件基础. 芯片产品:昇腾31 ...

  10. JuiceFS 社区版 v1.1- Beta 发布,新增五个实用功能

    我们很高兴地宣布 JuiceFS v1.1-Beta 版本正式发布啦!这是一个功能丰富的版本,带来了许多实用的新功能和改进.在这个版本中我们新增了以下功能: 目录配额:为目录设置配额限制,控制其大小和 ...