非零基础自学Golang 第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.4 发起POST请求

news2024/11/15 23:47:13

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第17章 HTTP编程(上)
        • 17.2 HTTP客户端
          • 17.2.4 发起POST请求

第17章 HTTP编程(上)

17.2 HTTP客户端

17.2.4 发起POST请求

在上一小节我们使用了http.NewRequest来创建一个请求,http.NewRequest有三个参数,第一个是请求方法Method,第二个是请求地址URL,最后一个参数是body,其类型为io.Reader。

GET方法不需要使用body参数,只需传入nil即可,如果是POST请求,则需要使用该参数。

如果body参数实现了io.Closer接口,Request返回值的Body字段会被设置为body,并会被Client类型的Do、Post和PostForm方法以及Transport.RoundTrip方法关闭。

举个例子:

[ 动手写 17.2.6]

package main

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

func main() {

   client := &http.Client{}

   // 使用NopCloser 创建一个实现io.Closer 接口的body
   body := io.NopCloser(strings.NewReader("user=admin&pass=admin"))

   req, err := http.NewRequest("POST", "http://www.baidu.com", body)

   if err != nil {
      fmt.Println(err)
   }

   // 打印输出 body
   req_body, err := io.ReadAll(req.Body)
   fmt.Println(string(req_body))

   // POST 提交表单需要添加此 Header 头
   req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

   resp, err := client.Do(req)
   if err != nil {
      fmt.Println(err)
   }

   // 在client 使用Do 方法后, 再次打印Body 发现Body 已经被关闭, 使用ReadAll 读取会导致错误
   req_body, err = io.ReadAll(resp.Request.Body)
   if err != nil {
      fmt.Println(err)
   }

   fmt.Println(string(req_body))
}

动手写17.2.6使用了ioutil.NopCloser创建了一个实现io.Closer接口的body对象,将其传入http.NewRequest的第三个参数,在发起请求前(client.Do()前),打印输出了req.Body。

在请求后再次以同样的方式打印输出请求Body就会发现程序报错,原因是请求的Body在Client类型的Do方法运行后就会被关闭,程序输出空指针异常。

运行结果如下:

在这里插入图片描述

我们同样可以使用http包封装后的POST方法来实现POST请求。

func Post(url string, bodyType string, body io.Reader) (resp *Response, err error)

Post向指定的URL发出一个POST请求,bodyType为POST数据的类型,body为POST数据,作为请求的主体。如果参数body实现了io.Closer接口,它会在发送请求后被关闭,调用者有责任在读取完返回值resp的主体后关闭它。

该方法是对Client的POST方法的包装。

[ 动手写 17.2.7]

package main

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

func main() {

   resp, err := http.Post("http://www.baidu.com", "application/x-www-form-urlencoded", strings.NewReader("user=admin&pass=admin"))

   if err != nil {
      fmt.Println(err)
   }

   defer resp.Body.Close()
   body, err := io.ReadAll(resp.Body)

   if err != nil {
      fmt.Println(err)
   }

   fmt.Println(string(body))
}

运行结果

在这里插入图片描述

除了POST方法,http包还封装了一个叫PostForm的方法。

func PostForm(url string, data url.Values) (resp *Response, err error)

PostForm向指定的URL发出一个POST请求,url.Values类型的data会被编码为请求的主体。如果返回值err为nil,resp.Body总是非nil的,调用者应该在读取完resp.Body后关闭它。该方法是对Client的PostForm方法的包装。

我们使用PostForm来改写动手写17.2.7:

[ 动手写 17.2.8]

package main

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

func main() {

   resp, err := http.PostForm("http://www.baidu.com", url.Values{"user": {"admin"}, "pass": {"admin"}})

   if err != nil {
      fmt.Println(err)
   }

   defer resp.Body.Close()
   body, err := io.ReadAll(resp.Body)
   if err != nil {
      fmt.Println(err)
   }

   fmt.Println(string(body))
}

运行结果

在这里插入图片描述

OK,运行效果一致。

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

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

相关文章

web前端-javascript-String字符串的相关方法

文章目录字符串的相关方法1. 底层字符串保存2. 方法1) length 属性 获取长度2) charAt() 获取指定字符3) chartCodeAt() 获取指定字符编码4) String.formCharCode() 根据编码获取字符5) concat() 连接字符串6) indexOf() 是否含有指定内容7) lastIndexOf() 是否含有指定内容8) …

哈斯机床联网

一、设备信息确认 1、确认型号 哈斯的数控面板共有两种情况。 老版本: 新版本: 注:老版本通讯为串口,新版本通讯为网口。 2、确认通讯接口 1、数控面板的后面 老版本的串口一般都会引出在正后面的左侧位置,上面有…

结构型模式之代理模式(八)

常说的设计模式是23种设计模式,分为3大类: 创建型模式5种:工厂方法、抽象工厂、单例、建造者、原型结构型模式7种:适配器、代理、桥接、装饰者、外观、享元、组合行为型模式11种:模板方法、解释器、策略、观察者、迭代…

非零基础自学Golang 第15章 Go命令行工具 15.5 代码测试(test) 15.5.1 单元测试

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.5 代码测试(test)15.5.1 单元测试第15章 Go命令行工具 15.5 代码测试(test) go test命令用于对Go语言编写的代码包进行测试。 可以指定要测试的文件,也可以直接对整个包进行测试&#xff0c…

[Java实战]Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]

Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]1.Squaretest是什么?2.如何配合JUnit使用...?3.生成的java文件长啥样?4.如何生成和使用?5.如何用生成的XXXTest.java文件进行单元测试...6.观察结果7.单元测试成功8.源码地址为了好好写单元测试,提…

Dell inspiron 7580硬件升级_更换电池加内存条移动硬盘

文章目录前言硬件升级确认硬件型号参数拆机验证硬件更新后记前言 手上的笔记本[Dell inspiron 7580]用了几年了,还是刚上大学的时候买的,现在感觉这个配置用起来有点吃力了,稍微更新一下配置准备再战两年┭┮﹏┭┮ Light em up, light em u…

参数扫描文件的用法

摘要 通过控制和改变所选参数有助于检查给定光学系统的性能。 VirtualLab Fusion提供了完全灵活且计算效率高(通过并行化)的参数运行,使用户可以指定不同的参数变化方式。 作为示例,它可以用于所研究的任何系统参数的公差分析。 分…

Moonbeam生态说|Moonbeam Ignite重燃DeFi生态活力

日前,Moonbeam Network生态中两家活跃度最高的DeFi协议Moonwell和StellaSwap受邀参加Moonbeam中文社区BinanceLive直播。 作为Moonbeam生态的老朋友,两家项目方的联合创始人对赋能生态胸有成竹。 今年11月,Moonwell和StellaSwap都得到社区投票…

MORE CONVNETS IN THE 2020S: SCALING UP KER- NELS BEYOND 51 × 51 USING SPARSITY

论文链接: https://arxiv.org/pdf/2207.03620.pdf code: https://github.com/VITA-Group/SLaKlink MORE CONVNETS IN THE 2020S: SCALING UP KER- NELS BEYOND 51 51 USING SPARSITY一、引言(二)、大内核注意力(二)、卷积中的大…

I/O多路转接 —— select、poll、epoll

目录 一、概述 二、I/O多路转接 —— select 1. select函数的基本介绍 2. select的基本工作流程 3. 文件描述符的就绪条件 4. 基于select函数设计的服务器 1. 基本套接字的编写 2. select服务器的编写 5. select的优缺点 三、I/O多路转接 —— poll 1. poll函数的基…

LeetCode-1799- N 次操作后的最大分数和

1、状态压缩动态规划 我们可以使用动态规划来解决问题,我们利用数组dp[s]dp[s]dp[s]来表示状态为s时,能够去到的最大分数。由于题目限定了n的范围,因此我们可以利用二进制数字s来压缩状态,我们利用长度为m的二进制数s的每一位来表…

Javascript | Popper | 如何下载popper.min.js 与 各类js资源

文章目录问题描述解决办法问题描述 作为一个JS生手只知道使用CDN在线引用或者使用下载好的本地JS文件。 比如popper.js官网显示如下图,没有任何的Download按钮,有部分其他类的JS官网也存在同样的情况。 虽然有提供CDN,但因为国内网络原因&am…

Lua table(表)

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。 Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。 Lua table 是不固定大小的,你可以根据自己需要…

什么是python,为什么要学习Python?

什么是python? 人工智能概念的兴起,使得Python的发展非常迅速,关注度也是越来越高。作为现在最热门的编程语言,Python简单优雅,用尽量少的代码写出最明白的程序,简单易学的特性使其拥有超高的人气&#xf…

VUE—跳转传参

目录 一、基本使用 二、$route和$router 三、路由跳转的两种方式 四、编程式导航 五、传参 六、props 一、基本使用 1、安装vue-router cnpm install --save vue-router3 如果大家用的是vue2,下载vue-router不设置版本好的话,可能会因为版本过高…

大数据Kudu(十一):ClickHouse与Kudu对比

文章目录 ClickHouse与Kudu对比 ClickHouse与Kudu对比 kudu 2015年9月28号出现第一个测试版本0.5.0,2016年2月26第一个正式版0.7.发布。clickhouse 2018年3月开源正式版出现。两者都是列式存储,都可以针对数据进行实时OLAP分析,两者的区别如下: 方面 Kudu

零基础小白如何做到5个月学成Python?学习规划在这里!

自学半个月没用不是正常的吗?一般来说,Python培训需要脱产学习5个月左右,这样的市场既能掌握工作所需的技能,还能够积累一定的项目经验。 当然,如果你想要在Python的路上越走越远,则需要不断的积累和学习&…

实验二 单隐层神经网络

一、实验目的 (1)学习并掌握常见的机器学习方法; (2)能够结合所学的python知识实现机器学习算法; (3)能够用所学的机器学习算法解决实际问题。 二、实验内容与要求 &#xff08…

我们是如何构建自己的可观测性的

引言 近日,关于云平台自身的可靠性问题又成为大家关注的焦点。系统一定会有故障,相信作为用户都能理解,但用户需要在故障发生后,能尽快知晓造成故障的根本原因和修复计划,以便有效调整受影响的业务来降低损失&#xf…

盘点2022年电视行业:科技与美学的战场三星缔造“生活方式”的全新价值

作者 | 曾响铃 文 | 响铃说 前不久,中国质量协会第十一次组织开展了本年度电视行业用户满意度监测,监测对象为市场占有率达90%以上的10个主流电视品牌,结果显示2022年电视行业用户满意度为83分,同比持平,处于较高水平…