go语言带cookie的net客户端请求与[]byte转string
前些日子参加了一个叫Advent of Code的编程大赛,每天一道题,快活似神仙。这每道题都有自己的拼图数据输入puzzle input,要做题就需要用到该数据,把数据复制过来感觉又太麻烦,于是就兴起写了一个直接从html读取数据的函数。
其数据如下:
+12
-10
-4
-8
+18
-1
-13
...
查看标准库文档,发现net/html包可以做这个功能,其函数如下:
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...
然后调试,但并未有相关数据输出,在浏览器中检查元素发现该请求需要带cookie才能正确返回数据。直接使用http.Get()并不带有cookie,所以改用NewRequest使用指定的方法、网址和可选的主题创建并返回一个新的*Request。其函数如下:
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Cookie", "name=value")
resp, err := client.Do(req)
robots, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()//必须要关闭Body
用ioutil.ReadAll()返回的是[]byte类型,入需要使用可以先将[]byte转换成string,Go语言初学者都会的类型转换语法:string(b),Go为了稳定性对于上述方法需要经过一些数据上的复制,一旦数据量过大,这个成本是难以忍受的。
所以为了让Go服帖,我们得用上unsafe包,unsafe包提供一些可以跳过Go语言类型安全限制的操作。看下面代码:
func BytesString(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
我们取到[]byte的指针,Go会说*byte不是*string,但是我们有外挂unsafe.Pointer,所以Go就通过了,接着你很自在的把*byte转成了*string,因为reflect.StringHeader和reflect.SliceHeader的结构体只相差末尾一个字段。
类似的用法可以看Go语言黑魔法
接着用regexp包正则表达式FindAllString取出匹配的[]string数据使用,然后再用strconv.Atoi()进行转化就可以了。
Day1的题为求和,其代码如下:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"regexp"
"strconv"
"unsafe"
)
func BytesString(b []byte) string {//[]byte 转string
return *(*string)(unsafe.Pointer(&b))
}
func getPuzzle(url string) string {//从网页抓取数据
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Cookie", "session=53616c7xxx")
resp, err := client.Do(req)
robots, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
str := BytesString(robots)
return str
}
func sum(num []int) int {
sum := 0
for _, n := range num {
sum += n
}
return sum
}
func strtoint(str []string) []int {//string转int
num := make([]int, len(str))
for i := 0; i < len(str); i++ {
flag := str[i][0]
chafre, _ := strconv.Atoi(str[i][1:])
switch flag {
case '+':
num[i] = chafre
case '-':
num[i] = -chafre
}
}
return num
}
func main() {
change := getPuzzle("https://adventofcode.com/2018/day/1/input")
re := regexp.MustCompile("[+|-][0-9]*")//正则表达式
str := re.FindAllString(change, -1)
num := strtoint(str)
sum := sum(num)
fmt.Printf("sum is %d\n", sum)
}
如果有更好的方法,欢迎私信,哈哈哈···
go语言带cookie的net客户端请求与[]byte转string的更多相关文章
- 【HTTP header】【Access-Control-Allow-Credentials】跨域Ajax请求时是否带Cookie的设置
1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...
- 跨域Ajax请求时是否带Cookie的设置
1. 无关Cookie跨域Ajax请求 客户端 以 Jquery 的 ajax 为例: $.ajax({ url : 'http://remote.domain.com/corsrequest', d ...
- postman发送带cookie的http请求
1:需求:测试接口的访问权限,对于某些接口A可以访问,B不能访问. 2:问题:对于get请求很简单,登录之后,直接使用浏览器访问就可以: 对于post请求的怎么测试呢?前提是需要登录态,才能访问接口. ...
- postman 请求带cookie
以亚马逊为例,我抓包随便看一个返回是json数据格式的一个接口,比如随便点一个,我的订单 随便找一条,然后复制url过滤 右键,copy下url 将url放入filter过滤: 在postman里面, ...
- urllib2 post请求方式,带cookie,添加请求头
#encoding = utf-8 import urllib2import urllib url = 'http://httpbin.org/post'data={"name": ...
- PostMan 使用Interceptor 发送带cookie的请求一直loading
问题 最近要写一个爬虫(虽然是第一次写),于是就用了Chrome上非常方便一个插件,PostMan,但是由于chrome安全的限制,发不出带cookie和带有自定义头部标签的请求. 百度一番后得如果想 ...
- HTTPClient实现免登陆请求(带cookie请求)
背景: 使用httpClient请求某登录型网站,模拟一个操作,一般步骤一个httpclient模式登录->httpClient模拟操作: 此时发现,每次操作都需要进行一次登录,极其浪费时间,是 ...
- 带cookie请求数据
经常会用到一些采集网上的资源,普通网站很好采,get_file_contents()/c_url(). 有的网站会有登陆后才能采集,需要带cookie请求获取(登陆网站相同方法),下面记录一下使用方法 ...
- 使用Postman Interceptor发送带cookie的请求一直loading的解决法案
很多web网页开发人员都知道Postman限制由于chrome安全的限制,发不出带cookie和带有自定义头部标签的请求.想要发出由于chrome安全的限制,发不出带cookie和带有自定义头部标签的 ...
随机推荐
- Druid学习---配置_DruidDataSource参考配置
[更多参考]https://www.cnblogs.com/niejunlei/p/5977895.html 配置_DruidDataSource参考配置 以下是一个参考的连接池配置: <bea ...
- JS实现手机摇一摇功能
//运动事件监听 if (window.DeviceMotionEvent) { window.addEventListener('devicemotion',deviceMotionHandler, ...
- DZ拿shell总结
今天碰到一个dz的站,好久没拿了 ,拿下shell觉得应该总结一下 Uc_server默认密码 其实有了UC_SERVER就是有了网站的全部权限了,有了UC_SERVER你可以重置管理员密码 可以进后 ...
- python 中的set与list,tuple
__author__ = 'liunnis' #-*-coding:utf-8 -*- a=[1,2,3,4,4] print a print list(set(a)) b=[str(i) for i ...
- BZOJ1012:[JSOI2008]最大数maxnumber(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L 个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. ...
- tar 打包带软连接的文件
打包普通文件夹,压缩带参数z,创建tar.gz tar -cvf ./tmp/SK_Aug_camera.tar ./gap_40_5 但是文件夹里含有软连接,带参数 h tar -cvhf ./tm ...
- 【[AHOI2008]逆序对】
被锤爆了 被这个题搞得自闭了一上午,觉得自己没什么前途了 我又没有看出来这个题的一个非常重要的性质 我们填进去的数一定是单调不降的 首先如果填进去的数并不是单调不降的,那么填进去本身就会产生一些逆序对 ...
- ZooKeeper学习之路 (八)ZooKeeper原理解析
ZooKeeper中的各种角色 ZooKeeper与客户端 每个Server在工作过程中有三种状态: LOOKING:当前Server不知道leader是谁,正在搜寻 LEADING:当前Server ...
- Zookeeper学习之路 (三)shell操作
Zookeeper的shell操作 Zookeeper命令工具 在启动Zookeeper服务之后,输入以下命令,连接到Zookeeper服务: [hadoop@hadoop1 ~]$ zkCli.sh ...
- git删除指定文件夹
1.在本地仓库删除指定文件 git rm 文件名名称 2.在本地仓库删除指定文件夹 git rm -r 文件夹/ 3.提交修改 git commit -m"删除文件夹" 4.推送到 ...