golang http客户端实例

Go入门实战:HTTP客户端和服务端 1.背景介绍 Go作为目前火爆的语言,被誉为C语言的高级编程语言,它提供了非常简洁、高效的语法,在编写网络服务方面也相对较为容易。所以Go语言是网络服务开发者不可多得的选择。但是Go语言并不是仅限于网络应用的开发领域。例如,对于数据库、缓存、消息队列等应用场景,Go同样可以提供很好的支持。 虽然有很多优秀的开源项目帮助Go进行快速的开发,但是还是有不少 阅读详情

golang的net/http包已经提供了强大了网络操作函数,我们编写的web客户端示例如下:

package main

import (
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
  //Get请求
    res, err := http.Get("http://www.baidu.com")
    if err != nil {
        log.Fatal(err)
    }
  //利用ioutil包读取百度服务器返回的数据
    data, err := ioutil.ReadAll(res.Body)
    res.Body.Close()//一定要记得关闭连接
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("%s", data)
}

可以通过请求头来控制请求的参数。

设置请求头参数之前需求构造一个请求,从而进行参数设定。我们首先将main函数改造成如下所示:

func main() {
    client := &http.Client{}
    url := "http://www.baidu.com"
    req, err := http.NewRequest("GET", url, nil)//GET大写
    if err != nil {
        log.Fatal(err)
    }
    rep, err := client.Do(req)//发起请求
    if err != nil {
        log.Fatal(err)
    }
    data, err := ioutil.ReadAll(rep.Body)
    rep.Body.Close()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("%s", data)
}

客户端在发送请求时,可以通过设定请求头中的多项参数规范请求的特性,例如字符编码集、语言等等,详细信息大家可以参照:这里 

常见的几项设置:

Accept::浏览器可接受的数据类型;
Accept-Charset:浏览器可接受的字符编码集;
Accept-Encoding:浏览器可接受的编码方法;
Accept-Language:浏览器可接受的语言;
Connection:是否为持久连接,默认长连接keep-alive,由于网页数据很多,所以浏览器可能是连续多次请求服务器数据的,此时多次访问只有首次完成tcp3次握手,减少消耗;而tcp中的keep-alive是tcp连接的有效时长,一般比http的keep-alive的时间长。
Cookie:Cookie值;
Content-Lenght:请求内容的长度,过长和果断将导致请求内容截断;如果不知道可以不设置,交由底层完成;
Host:访问的服务器地址;
User-Agent:用户信息。

了解基本几个参数的设置后,将其设置为相应的值即可,执行后即可拿到百度服务器返回的数据。

func main() {
    client := &http.Client{}
    url := "http://www.baidu.com"
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        log.Fatal(err)
    }

    req.Header.Add("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    req.Header.Add("Accept-Charset","utf-8")
    //req.Header.Add("Accept-Encoding","br, gzip, deflate")
    req.Header.Add("Accept-Language","zh-cn")
    req.Header.Add("Connection","keep-alive")
    //req.Header.Add("Cookie","xxxxxxxxxxxxxxx")
    //req.Header.Add("Content-Lenght",xxx)
    req.Header.Add("Host","www.baidu.com")
    req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
    rep, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    data, err := ioutil.ReadAll(rep.Body)
    rep.Body.Close()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("%s", data)
}

百度作为一个搜索平台,我们可以在请求中加入搜索词,然后获取搜索结果。还有很多场景都需要我们提交数据,如注册登陆、Google翻译等等。那如何提交数据呢?这就要用post方法向服务器提交。

func main() {
    client := &http.Client{}
    req_data := `{"name":"ali", "age":"18"}`
    url := "http://www.baidu.com"
    req, err := http.NewRequest("POST", url,  strings.NewReader(req_data))
    if err != nil {
        log.Fatal(err)
    }
    //Content-Type很重要,下文解释
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    //req.Header.Set("Content-Type", "application/json")
    //req.Header.Set("Content-Type", "multipart/form-data")

    rep, err := client.Do(req)
    if err != nil {
        log.Fatal(err)
    }
    data, err := ioutil.ReadAll(rep.Body)
    rep.Body.Close()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("%s", data)
}

上面的代码意在向百度提交name和age数据,由于百度服务器并不识别name和age,所以无法返回正确的数据,但流程上是正确的。其中有必要说一下Content-Type,它是用于规定提交数据的类型,常见的有application/x-www-form-urlencoded、application/form-data和application/json等,下面分别说明一下:

application/x-www-form-urlencoded:最常见的类型之一,表示将数据转化为键值对后提交,例如name=ali&age=18.但是如果有本身数据中有&字符就可能造成歧义,例如二进制文件等。

application/form-data:表示以表格数据上报,即将多组数据以一串复杂的boundary数据分隔,而非&符;因此这种数据类型可以用于上传文件或有&符的数据。

application/json:表示将提交的数据转化成json格式。

更多有关content-type的资料请参照这里

结合之前文章中提到的gorutine,sync.WaitGroup等知识,将代码简化封装成如下所示。可以通过修改url的值访问本地服务器。

package main

import (
	"io/ioutil"
	"log"
	"net/http"
	"sync"
)

var wc sync.WaitGroup

func HelloClient(client *http.Client, url string){
	defer wc.Done()
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		log.Fatal(err)
	}
	rep, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	data, err := ioutil.ReadAll(rep.Body)
	rep.Body.Close()
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("%s", data)
}
func main() {
	client := &http.Client{}
	url := "http://127.0.0.1:8000"
	wc.Add(10)
	for i := 0; i < 10; i++{
		go HelloClient(client, url)
	}
	wc.Wait()
}

 原文地址:https://zhuanlan.zhihu.com/p/134146738

云模型在综合评价过程中的应用 目录 1 云模型标尺(标准云模型)的构建方法 1.1 通过正态云的“3En 规则”来表示评价论域 1.2 通过论域的边界值隶属度相等来表示评价论域 1.3 通过黄金分割法来表示评价论域 2 确定评价结果的过程 2.1 基本云发生器 2.2 X条件云发生器 2.3 两种方法的区别 综合评价问题一般分为以下六个步骤 1、明确评价目的; 2、确定被评价对象; 3、建立评价指标体系(包括收集评价指标的原始值、评价指标的若干预处理等); 4、确立与各项评价指标相对应的权重系数; 5、选.. 阅读详情

相关推荐

分析方法—temporal receptive field(TRF)

总结来说,时间感受野其实就是一个 filter!课程中的描述—.(使用时间感受野与刺激进行卷积来描述)时间感受野一般是听觉计算中使用的,在视觉中,有另一种分析叫做空间感受野(spatial receptive fields)。回归权重(Regression weights)是指在回归分析中用于估计自变量与因变量之间关系的权重或系数。回归分析是一种统计方法,用于建立自变量与因变量之间的关联模型,并通过拟合数据来估计模型中的参数。在简单线性回归中,只有一个自变量与一个因变量之间的关系被建模。

m0_51474171的博客 1602

【Golang】golang实现post请求发送form类型数据函数

golang实现post请求发送form类型数据函数 //发送http post请求数据为form func PostForm(url string, data url.Values) (string, error) { resp, err := http.PostForm(url, data) if err != nil { return "", err ...

程序员老狼专注开发aigc或客服系统应用 2752

【MM小贴士】关于SAP系统中关税的处理方式

的运费,这部分来讲,我们关税的计价基础,就应该是货物价值+包邮到中国港口的运费,完后进行报关操作,缴纳关税,后半段从中国港口拉回到企业里面的运输费,就会做到费用里面去,而不是计入到存货成本。1、我们自己的企业和国外厂家A购买一项物资,厂家A的报价会分成几个组成部分货物本身的价值或者货物本身的价值+到国外港口的运费或者货物本身的价值+到中国港口的运费或者货物本身的价值+包邮到你们自己企业的整体运费。所以我的关税就是不确定的。重点是运费是哪一段的运费,如何结算,结算的货币,何时能够确定运费。.........

竹大的博客 9022

Golang:发起http请求-GET带参数、POST发送Form和JSON数据

通过构建 Request 对象,设置请求头属性import ("fmt""io""net/http"响应},参考:Go实现 简单http请求(get ,post) 多种请求方式。

彭世瑜的博客 4502

SurfaceControlViewHost使用介绍

可以看到,主要用途:是把一个进程的View显示到另外一个进程里面。

chadm.xiang 1283

Quartus (Quartus Prime 18.1)的安装及仿真步骤

前两天做计组的课设需要用到Quartus 这个软件,但安装有点麻烦,在网上搜了很多教程,发现都是旧版本的,最后弄了好半天才把环境搭建好。所以,分享一下它的搭建过程。 因为我不经常用它,所以安装的版本是精简版的其他版本的也应该差不多以下是需要下载的安装包: 准备: Quartus Prime 精简版,最新发布: v18.1 1. QuartusLiteSetup-18.1.0.625-wi...

weixin_41082948的博客 8万+

golang解析http multipart/form的三种方式

multipart/form-data 顾名思义可以上传多个form-data 并且用分隔符进行分割,多用于文件上传1. http multipart/form-data 请求样例POST /handle HTTP/1.1Host: localhost:8080Connection: keep-aliveContent-Length: 182537Cache-Con...

weixin_33884611的博客 5553

大模型训练(1):流水线并行

Gpipe的方法是,在训练时计算和运用的是micro-batch里的均值和方差,但同时持续追踪全部mini-batch的移动平均和方差,以便在测试阶段进行使用。流水线并行的核心思想是:在模型并行的基础上,进一步引入数据并行的办法,即把原先的数据再划分成若干个更小的batch,分批送入GPU进行训练,算一部分就让下一个GPU动起来。从实验结果可知,在关掉NVlinks的情况下,Gpipe一样也能实现随着GPU数量的增加,训练速度也增加的效果。前文说过,随着模型的增加,每块GPU中存储的中间结果也会越大。

呆呆象呆呆的博客 1968

golang http PostForm请求示例

请求代码: package main import ( "fmt" "io/ioutil" "net/http" "net/url" ) func main() { resp, err := http.PostForm("http://172.31.2.68:5863/sysapp/apaas/share/getSharePermissionRuleList.do", url.Values{"page": {"1"}, "rows": {"100"}}) if

cainiaobulan的博客 3121

Silly Tavern(酒馆)AI 角色扮演下载与安装教程(Windows本地部署)

SillyTavern是一款开源AI角色扮演前端工具,支持沉浸式对话和长期角色互动。本文详细介绍了在Windows系统F盘部署SillyTavern的完整流程,包括下载项目、安装Node.js和Git环境、配置路径、启动服务等关键步骤,并特别说明非系统盘路径可能遇到的npm安装问题及解决方法。成功启动后,用户可通过浏览器访问本地地址使用该工具进行AI角色扮演互动。

Tan3851的博客 1万+

RH850从0搭建Autosar开发环境【1】- 如何创建Davinci Configurator配置工程

当我们在公司接触Autosar开发环境时,基本都是完整的Davinci Configurator的配置工程,我们只能修修补补。 从本章开始将手把手搭建Rh850基于Vector公司Davinci Configurator的autosar配置工程。主要涉及到OS,COM,DCMM,NVM,BSWM,ECUM等基本模块,包括Vlink,memap使用,XCP标定的实现等。基本是实现一个基础版的项目开发。包括后期的GreenHills编译问题处理,生成最终的Hex文件。

weixin_42412049的博客 1万+

Go语言:post方式发送带有form-data参数的http请求

完整的http请求代码就不放了,直接写上构造form-data参数的代码。 const ( http_address = "http://yourIP:8080/****" ) // 用url.values方式构造form-data参数 formValues := url.Values{} formValues .Set("first",firstData) formValues .Set("second",secondData) formDataStr := formValues .Encode

FFDreamer的博客 1万+

<PLC><socket><汇川>汇川PLC使用socket与其他控制器(如上位机)通讯模板程序示例

以上介绍了汇川PLC通用socket通讯的示例,事实上,汇川的官方手册也有使用示例,可以直接仿照使用,也可以加以修改。

用沸腾的热血,支付我们的人生吧! 3247

在 Golang 中复用 HTTP 连接

最近在实现一个转发大模型调用请求的中转功能,涉及到要构造client发送请求的内容,一开始我每次都是新建一个client来发送请求,这样的代码实现存在一些问题——每次都要构造新的client,并且要重新建立连接。后面了解到在Go中使用 HTTP 客户端(在 Go 中,HTTP 客户端默认会复用 TCP 连接,只要使用同一个。会根据空闲连接数和超时管理复用,可根据需求调整。,做到提高性能并减少 TCP 连接的重复建立。实例,并且服务端支持。

2402_85491806的博客 610

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

探索Go语言中的HTTP客户端优化:cleanhttp项目介绍

探索Go语言中的HTTP客户端优化:cleanhttp项目介绍 项目介绍 在Go语言的开发过程中,http.Client是一个常用的工具,用于处理HTTP请求。然而,Go标准库中的http.DefaultClient是一个全局共享的实例,这可能导致在多库、多goroutine环境下出现难以调试的问题,如竞态条件和意外的共享状态修改。为了解决这些问题,cleanhttp项目应运而生。它提供了一种简单...

gitblog_00072的博客 372

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

PHP 与go 通讯,Go socket实现多语言间通信

前言socket提供了在传输层进行网络编程的方法,它比基于http协议的接口传输更高效,RPC(Remote Procedure Call)是远程过程调用,常用于分布式系统等,而rpc很多是基于socket实现的。不了解socket、http等协议请阅读Socket 都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。它不局限于某一语言,这里我们主...

weixin_39612332的博客 351

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Golang笔记 6.1.1 HTTP 客户端

Go语言标准库提供的 HTTP 客户端相当优雅,一方面可以极其简单的使用 Get、Post 方法,另一方面又具备极大的灵活性(可以详细设置业务层和传输层的细节)。

IoT小能手 1262

Go语言实战:网络编程之HTTP客户端

1.背景介绍 1. 背景介绍 Go语言是一种现代的编程语言,由Google的Robert Griesemer、Rob Pike和Ken Thompson于2009年开发。Go语言的设计目标是简洁、高效、可扩展和易于使用。它具有弱类型、垃圾回收、并发处理等特点,适用于构建高性能、可靠的网络应用。 HTTP客户端是网络编程中的一个重要环节,用于与Web服务器进行通信。在Go语言中,可以使用net...

AI天才研究院 1417

Go语言从入门到精通八——socket和http编程

golang中的socket编程 关于socket的基础知识,这里就不介绍了,可以参考python socket编程。 golang创建socket很简单,服务端处理流程通常为: 监听端口 接受客户端的连接请求 创建goroutine,处理该请求 示例代码如下: package main import ( &quot;fmt&quot; &quot;net&quot; ) func main() { //...

Dev-L的博客 824

golang HTTP客户端

Get, Head, Post, and PostForm 可以构成HTTP (or HTTPS) requests: resp, err := http.Get("http://example.com/") ... resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf) ... res...

weixin_30826761的博客 104

go http

http包提供了HTTP客户端和服务端的实现 *http.Request 获取客户端提交的数据 http.ResponseWriter向客户端响应数据 http_server.go: /* 自定义http的业务逻辑函数 */ // response是一个io.Writer, 相当于一个打开了的文件(浏览器窗口) func login(response http.ResponseW...

lljxk2008的博客 521

go基础 go的HTTP网络编程

go的http编程有如下优点: Go原生支持http, import(“net/http”) Go的http服务性能和nginx比较接近 几行代码就可以实现一个web服务 http编程示例

一越王超的博客 7424

通过实例理解Go标准库http包是如何处理keep-alive连接的

HTTP是如今互联网的基础协议,承载了互联网上的绝大部分应用层流量,并且从目前趋势来看,在未来10年,http仍然会是互联网应用的主要协议。Go语言自带“电池”[1],基于Go标准库我们...

TonyBai 3379

使用golang的http模块构建redis读写查api

前沿: 这两天试着用golang做一些高性能的api,不想把压力到聚合在平台的接口上。平台因为要做很多耗时间的操作,uwsgi下会出现少许错误,找了一圈不知道如何解决该问题。 暂时先绕道而行,先拿简单的接口来做测试,慢慢的把复杂的操作也迁移到golang上。 话说以前高性能的接口,我用的最多的方案还是nginx lua...

weixin_33923762的博客 375

go语言服务器连接编程,go语言实现http服务端与客户端的例子

go语言实现http服务端与客户端的例子发布时间:2020-09-07 09:53:02来源:脚本之家阅读:84作者:大大大白go语言的net/http包的使用非常的简单优雅(1)服务端package mainimport ("flag""fmt""net/http")func main() {host := flag.String("host", "127.0.0.1", "listen hos...

weixin_31328561的博客 459

golang 时间戳_Golang开源 goaxios (HTTP Client) 入门

go-axios入门前言日常开发中,各服务主要都是REST的形式提供接口服务,因此HTTP Client则是开发中的重中之重。 golang中自带的HTTP Client已经能满足各类的场景,但是在使用的时候,各依赖服务的调用都基于同一模块,调整相关代码时影响较大,一些老旧系统的出错响应不规范,导致出错处理流程复杂难懂, go-axios则由此而生。go-axios整体思路沿用(抄...

weixin_39727336的博客 461
上一篇: 分布式共识算法对比分析
下一篇: gRPC 的四种数据流以及metadata示例
DreamCatcher
博客等级 码龄20年 23粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DreamCatcher

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值