首页 > 编程语言 >Go HTTP编程

Go HTTP编程

时间:2023-03-22 22:46:18浏览次数:38  
标签:Body http fmt 编程 Println Go HTTP resp

目录


Go 语言标准库内建提供了 net/http 包,涵盖了 HTTP 客户端和服务端的具体实现,使得我们可以很方便地编写 HTTP 客户端或服务端的程序。


HTTP 服务端

示例:

package main

import (
    "fmt"
    "net/http"
)

//服务端编写的业务逻辑处理程序 —— 回调函数
func myHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method = ", r.Method) //请求方法
    fmt.Println("URL = ", r.URL)       // 浏览器发送请求文件路径
    fmt.Println("header = ", r.Header) // 请求头
    fmt.Println("body = ", r.Body)     // 请求包体
    fmt.Println(r.RemoteAddr, "连接成功")  //客户端网络地址

    w.Write([]byte("hello http")) //给客户端回复数据
}

func main() {
    http.HandleFunc("/hello", myHandler) // 注册处理函数

    //该方法用于在指定的 TCP 网络地址 addr 进行监听,然后调用服务端处理程序来处理传入的连接请求。
    //该方法有两个参数:第一个参数 addr 即监听地址;第二个参数表示服务端处理程序,通常为nil
    //当参2为nil时,服务端调用 http.DefaultServeMux 进行处理
    http.ListenAndServe("127.0.0.1:8000", nil)
}

浏览器访问 http://localhost:8000/hello ,返回 "hello http" 。

服务端打印:
method = GET
URL = /hello
header = map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7] A
ccept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9] Connection:[keep-alive] Dnt:[1] Sec-Ch-Ua:["Chromium";v="110", "Not A(Brand";v="24", "Google
Chrome";v="110"] Sec-Ch-Ua-Mobile:[?0] Sec-Ch-Ua-Platform:["Windows"] Sec-Fetch-Dest:[document] Sec-Fetch-Mode:[navigate] Sec-Fetch-Site:[none] Sec-Fetch-User:
[?1] Upgrade-Insecure-Requests:[1] User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36]]
body = {}
127.0.0.1:2651 连接成功

回调函数myHandler(w http.ResponseWriter, r *http.Request)有两个参数:

  • w http.ResponseWriter用来给客户端返回响应数据,它是一个 interface:
type ResponseWriter interface {
   Header() Header            
   Write([]byte) (int, error)    
   WriteHeader(int)            
}
  • r *http.Request用来接收客户端的请求数据,浏览器发送给服务器的 http 请求包的内容可以借助 r 来查看。它对应一个结构体:
type Request struct {
    Method string        // 浏览器请求方法 GET、POST…
    URL *url.URL        // 浏览器请求的访问路径
    ……
    Header Header        // 请求头部
    Body io.ReadCloser    // 请求包体
    RemoteAddr string    // 浏览器地址
    ……
    ctx context.Context
}

HTTP客户端

客户端访问 Web 服务器数据,主要使用 func Get(url string) (resp *Response, err error)函数来完成,其读到的响应报文数据被保存在 Response 结构体中。

type Response struct {
   Status     string // e.g. "200 OK"
   StatusCode int    // e.g.  200
   Proto      string // e.g. "HTTP/1.0"
   ……
   Header Header
   Body io.ReadCloser
   ……
}
  • 服务器发送的响应包体被保存在 Body 中,可以使用它提供的 Read 方法来获取数据内容,可以将其保存至切片缓冲区中,拼接成一个完整的字符串来查看。

  • 结束的时候,需要调用 Body 中的 Close() 方法关闭 I/O 。

示例:

import (
    "fmt"
    "net/http"
)

func main() {
    // 使用Get方法获取服务器响应包数据
    // resp, err := http.Get("http://www.baidu.com")
    resp, err := http.Get("http://127.0.0.1:8000/hello")
    if err != nil {
        fmt.Println("Get err:", err)
        return
    }
    defer resp.Body.Close()

    // 获取服务器端读到的数据
    fmt.Println("Status = ", resp.Status)         // 状态
    fmt.Println("StatusCode = ", resp.StatusCode) // 状态码
    fmt.Println("Header = ", resp.Header)         // 响应头部
    fmt.Println("Body = ", resp.Body)             // 响应包体

    buf := make([]byte, 4096) // 定义切片缓冲区,存读到的内容
    var result string
    // 获取服务器发送的数据包内容
    for {
        n, err := resp.Body.Read(buf) // 读body中的内容。
        if n == 0 {
            fmt.Println("Body.Read err:", err)
            break
        }
        result += string(buf[:n]) // 累加读到的数据内容
    }
    // 打印从body中读到的所有内容
    fmt.Println("result = ", result)
}

标签:Body,http,fmt,编程,Println,Go,HTTP,resp
From: https://www.cnblogs.com/juno3550/p/17245763.html

相关文章

  • 编程技巧-索引标记法
    在本周的CodeReview中,从Pair学到一个技巧--索引标记法(暂且叫这个名称)题目以任意一个Cell中心,根据8个邻居状态,判断该Cell下一个状态:如果2个活着那么保持状态不变,3个邻居活......
  • 一步步构建轻量级http-contract客户端
    http-client-plus是一个类似于Feign一样的申明式ESB请求代理组件,使用ESB请求代理组件,面向SpringCloud微服务的,老的项目spring3.x也支持.背景习惯于玩rpc的同学都知道,透明化......
  • Google Guice 入门教程05 - AOP(面向切面编程)
    2AOP面向切面编程2.1AOP入门在前面的章节主要讲Guice的依赖注入,有了依赖注入的基础后我们再来看Guice的AOP。我们先从一个例子入手,深入浅出的去理解Guice的AOP的原理和实......
  • Google Guice 入门教程07 - 整合第三方组件(1)
    4整合第三方组件在《GoogleGuice入门教程06 –Web和Servlet》中我们看到了Guice整合Struts2的应用。本章节继续讨论Guice整合其它第三方组件的应用。本章节重点谈G......
  • Django笔记五之字段类型
    这篇笔记介绍字段的类型FieldType。Django的model下的field对应的是MySQL中的表字段,而我们定义的field的类型则对应MySQL中的字段类型。本次主要介绍以下几......
  • 让你的vscode搭载ChatGPT获得来自 AI 的编程指导
    一直以来,VSCode都是开发者心目中的生产力神器,它免费、开源且跨平台,被称为最好用的IDE。把VSCode和ChatGPT结合使用,用户将获得来自AI的编程指导,包括代码解释、找......
  • 使用 go tool pprof 跟踪优化 cpu 和 内存
    搜了一些文章来看实在是没有重点,自己归纳一下。其实直接看文档已经比较清楚但是文档部分似乎没有一些介绍如何看火焰图之类的细节,这里一并归纳总结一下。 收集性能数......
  • tcp网络编程4—并发的io多路复用实现(select)
    原型:intselect(intmaxfdp1,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout)功能:委托内核检查描述符集是否准备好(即可以......
  • wails 基于golang 的跨平台开发解决方案
    wails是可以使用golang进行跨平台开发的框架参考使用依赖需要go18+,node15+安装 goinstallgithub.com/wailsapp/wails/v2/cmd/wails@latest......
  • Python 四大主流 Web 编程框架
    目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实。但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及......