18.2 HTTP服务器-处理函数、响应404错误

1. 处理函数

处理来自客户端的请求,并回之以特定的响应,这是处理函数的主要任务。在处理函数中,我们通常会完成如下工作:

  • 验证请求路径
    • http.Request.URL.Path
    • http.NotFound(...) 当请求没有对应的处理函数时,返回404错误。
  • 区分请求类型
    • http.Request.Method
  • 获取请求数据
    • http.Request.URL.Query(),从访问连接url中获取查询信息
    • http.Request.Body,直接获取body内容
  • 处理业务逻辑
    • 验证身份合法性
    • 读取处理数据

处理来自客户端的请求,并回之以特定的响应,这是处理函数的主要任务。

  • 选择响应类型
    • http.Request.Header.Get("Accept"),通过该语句可以得知客户端所能接受的响应类型。
    • http.ResponseWriter.Header().Set("Content-Type", ...),在响应写入器中,通过Header()字段的Set方法设置“Content-Type”参数的值,来设置具体的响应类型。
  • 返回响应报文
    • http.ResponseWriter.Write(...),写入字节流,是整个响应过程的最后一步。

返回响应报文一定是整个处理过程的最后一步,因为响应报文一旦返回客户端,之后对它再做任何修改都将无济于事。

  • w.Write([]byte("Hello World!"))
  • w.Header().Set("X-My-Header", "I am setting a header!") // 无效操作

2. 响应404错误

缺省路由的任务是将所有没有指定处理函数的请求都定向到"/",并不能很有效的针对无效的地址返回404。

  • 鉴于所请求的路由并不存在,可在这里响应404错误
    • func rootHandler(w http.ResponseWriter, r *http.Request) {
    •         if r.URL.Path != "/" { // 如果所请求的路径并非根目录
    •                 http.NotFound(w, r) // 响应404错误
    •                 return
    •         }
    •         ... // 所请求的路径是根目录,正常处理
    • }
  • 404错误的响应报文类似下面这个样子:
    • HTTP/1.1 404 Not Found
    • Content-Type: text/plain; charset=utf-8
    • X-Content-Type-Options: nosniff
    • Date: Sat, 29 Dec 2018 06:28:54 GMT
    • Content-Length: 19
    • 404 page not found

 

// 相应404错误
// 默认路由器的行为是将所有没有指定处理程序的HTTP请求都定向到对“/”的
// 处理,在这里如果发现HTTP请求中的URL路径并不是“/”,就响应404错误 
// 通过curl发起HTTP请求,可执行如下命令: 
// curl -is "http://localhost:8000"
// curl -is "http://localhost:8000/dummy"
package main
import "net/http"
func rootHandler(w http.ResponseWriter,r *http.Request) {if r.URL.Path != "/" {http.NotFound(w, r)return}w.Write([]byte("Hello World!"))
}
func main() {http.HandleFunc("/", rootHandler)http.ListenAndServe(":8000", nil)
}

 

 

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

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

相关文章

Vue3【十六】TS中的接口、泛型,自定义类型

Vue3【十六】TS中的接口、泛型&#xff0c;自定义类型 TS中的接口、泛型&#xff0c;自定义类型 案例截图 目录结构 代码 app.vue <template><div class"app"><h1>你好世界! 我是App根组件</h1><Person /></div> </templat…

docker部署mysql+nginx+redis

部署mysql 1、拉去镜像 docker search mysql docker pull mysql:5.7 2、运行镜像 docker run -p 3306:3306 --name mysql \ -v /home/mysql/log:/var/log/mysql \ -v /home/mysql/data:/var/lib/mysql \ -v /home/mysql/conf:/etc/mysql/conf.d \ -v /home/mysql/mysql-files…

OpenAI官方Prompt工程指南详解!再也不怕写不好Prompt了!

使用AI聊天、AI写作、还是AI绘图等过程中Prompt具有重要意义。 那么Prompt要怎么写效果才好&#xff1f;有没有标准化的模板可以直接用&#xff1f; 有&#xff0c;OpenAI官方发布了一份提示词工程指南&#xff0c;该指南分享了6大策略即可让AI输出更好的结果。至此&#xff…

树状数组介绍

树状数组&#xff08;Binary Indexed Tree&#xff0c;简称 BIT 或 Fenwick Tree&#xff09;是一种可以高效解决前缀和问题的数据结构。它能在对数时间复杂度内完成单点更新和查询前缀和的操作。树状数组通过一种巧妙的方式&#xff0c;将数组元素的值分布在不同的位置上&…

无线领夹麦克风哪个品牌性价比高?推荐领夹麦克风性价比最高品牌

当今的直播、短视频已经深深的融入到了我们的生活当中&#xff0c;很多小伙伴会通过拍摄短视频、Vlog来分享自己生活精彩的瞬间。不过录制视频时&#xff0c;如果单纯靠手机拾音&#xff0c;距离手机越远&#xff0c;声音越小越不清晰如果有噪音干扰&#xff0c;那更是“惨不忍…

ONVIF相关介绍

ONVIF致力于通过全球性的开放接口标准来推进网络视频在安防市场的应用,这一接口标准将确保不同厂商生产的网络视频产品具有互通性。2008年11月,论坛正式发布了ONVIF第一版规范——ONVIF核心规范1.0。随着视频监控的网络化应用,产业链的分工将越来越细。有些厂商专门做摄像头…

spring和mybatis中的连接池和缓存

文章目录 十、连接池10.1连接池10.2、mybatis连接池的分类 十一、mybatis的缓存一级缓存和二级缓存使用一级缓存失效的四种情况&#xff1a;11.1、不同的SqlSession对应不同的一级缓存。11.2、MyBatis的二级缓存 二级缓存开启的条件&#xff1a;11、3二级缓存的相关配置11.4、m…

计算机视觉与深度学习实战,Python为工具,基于计算机视觉的自动驾驶应用

一、引言 随着人工智能技术的飞速发展,计算机视觉与深度学习已成为当今科技领域的热点。其中,自动驾驶技术作为二者的完美结合,已经引起了广泛关注。自动驾驶技术依赖于计算机视觉实现对周围环境的感知与理解,通过深度学习对大量数据进行处理和分析,从而实现无人驾驶的目标…

pytest中失败用例重跑

pip install pytest-rerunfailures 下载rerunfailures插件包 配置文件中加入命令 --reruns 次数 也可在命令行中pytest --rerun-failures2 可以在allure报告中看到重试效果

【Echarts系列】水平柱状图

【Echarts系列】水平柱状图 序示例数据格式代码 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 示例 水平柱状图如图所示&#xff1a; 数据格式 data [{name: 于洪区,value: 2736},{name: 新民市,value: 2844},{name: 皇姑区,…

使用v-for实现点击当前li,li背景颜色变为红色,其余颜色不变

在 Vue 3 中&#xff0c;可以使用 <script setup> 语法糖来简化组件的编写。 下面是一个使用 Vue 3 和 <script setup> 实现的示例&#xff1a; <template> <ul> <li v-for"(item, index) in items" :key"index" :cl…

C++:SLT容器-->queue

C:SLT容器-->queue 1. queue容器2. queue 常用接口 1. queue容器 先进先出队列允许从一端插入元素&#xff0c;从另一端删除元素队列中只有队头和队尾可以被外界使用&#xff0c;因此队列不允许有遍历行为队列中插入数据称为入队(push)&#xff0c;删除数据称为出队(pop) …

JS 实现动态规划

function getPaths(m, n) {// m * n 二维数组&#xff0c;模拟网格const map new Array(m)for (let i 0; i < m; i) {map[i] new Array(n)}// 如果只走第一行&#xff0c;就只有一条路径。所以第一行所有 item 都填充 1map[0].fill(1)// 如果只走第一列&#xff0c;也只有…

ADAS功能规范总览

前提 本文对ADAS算法相关功能规范进行详细分解&#xff0c;本专栏是对自动驾驶相关从业者进行入门指导&#xff0c;会对功能算法各个部分进行详细梳理&#xff0c;如有不同见解评论或私信交流。相关ADAS的简化版本规范请关注我的ADAS辅助驾驶算法专栏。 功能规范 会按照以下…

快速删除 node_modules

在Windows系统上删除 node_modules 文件夹通常会比较慢&#xff0c;主要原因有以下几个&#xff1a; 1.文件数量多且嵌套深&#xff1a;node_modules 文件夹通常包含大量的子文件夹和文件&#xff0c;其中一些可能嵌套得非常深。Windows在删除文件和文件夹时&#xff0c;需要遍…

【vue3|第8期】深入理解Vue 3 computed计算属性

日期&#xff1a;2024年6月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

合约ABI探秘

EOA使用ABI调用 合约之间使用接口调用 自己写ABI&#xff0c;自己写接口 ABI探秘 EOA使用的ABI数据与合约间调用时调用者持有的接口时等价的&#xff0c;都是对合约函数签名的完整描述调用者使用ABI数据生成message中的calldata message上下文的变化 合约之间的调用也模拟…

8.11 矢量图层线要素单一符号使用六(光栅线)

文章目录 前言光栅线&#xff08;Raster Line&#xff09;QGis设置线符号为光栅线&#xff08;Raster Line&#xff09;二次开发代码实现光栅线&#xff08;Raster Line&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中光栅线&#xff08;Raster Line&#xff09;的使…

node设置镜像源详细教程

在Node.js环境中&#xff0c;你可以通过设置npm或yarn的镜像源来加速依赖包的下载。以下是如何设置npm和yarn的镜像源的详细步骤&#xff1a; 使用npm设置镜像源 临时设置镜像源&#xff1a; 你可以在安装包时临时指定镜像源&#xff0c;例如&#xff1a; npm install package…

FastWeb网站开发之拦截器(interceptor)使用教程

拦截器用于拦截和处理HTTP请求和响应。在请求开始处理之前进行拦截过滤与处理。 API文档 拦截器一般用于初始化lua脚本中创建拦截规则。 它主要用于浏览器的请求中某些目录或文件不允许访问、某些目录需要验证权限&#xff0c;在拦截器中进行判断并选择是否继续向下执行。 …