Golang(7)-net/http包的使用

本文详细介绍Golang中的net/http包使用,包括GET、POST等HTTP请求方法,并通过实例演示如何使用这些方法进行网络交互。


更多关于Golang核心编程知识的文章请看:Golang核心编程(0)-目录页


golang可以快速方便地实现简单的爬虫,本次我将使用net/http包、goquery库,具体的使用大家可以查询文档说明,本文只做一个简单的介绍。最后以一个爬取优快云的推荐文章列表的爬虫来演示golang爬虫的使用。

一、net/http包

net/http包是golang的内置标准库之一,在爬虫的应用中,它主要用于伪造请求去获得响应,从而将其交给其他程序用以解析,主要的方法有Get()、Post()、PostFrom()和Do()。

1.1、Get请求

get请求可以直接http.Get方法

func main() {
resp, err := http.Get("http://www.baidu.com")
	if err != nil {
		// handle error
		log.Println(err)
		return
	}
	//延迟关闭resp.Body,它是一个ioReader
	defer resp.Body.Close()
	//获得响应头
	headers := resp.Header

	for k, v := range headers {
		fmt.Printf("k=%v, v=%v\n", k, v)
	}
	//响应状态
	fmt.Printf("resp status %s,statusCode %d\n", resp.Status, resp.StatusCode)
	//协议
	fmt.Printf("resp Proto %s\n", resp.Proto)
	//响应体长度
	fmt.Printf("resp content length %d\n", resp.ContentLength)
	//编码表
	fmt.Printf("resp transfer encoding %v\n", resp.TransferEncoding)

	fmt.Printf("resp Uncompressed %t\n", resp.Uncompressed)
	//响应体,是主要解析的内容
	fmt.Println(reflect.TypeOf(resp.Body)) // *http.gzipReader

	buf := bytes.NewBuffer(make([]byte, 0, 512))

	length, _ := buf.ReadFrom(resp.Body)

	fmt.Println(len(buf.Bytes()))
	fmt.Println(length)
	fmt.Println(string(buf.Bytes()))
}
}
1.2、Do方法

有时需要在请求的时候设置头参数、cookie之类的数据,就可以使用http.Do方法。

func main() {
	client := &http.Client{}

	req, err := http.NewRequest("POST", "http://www.maimaiche.com/loginRegister/login.do",
		strings.NewReader("mobile=xxxxxxxxx&isRemberPwd=1"))
	if err != nil {
		log.Println(err)
		return
	}

	req.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")

	resp, err := client.Do(req)

	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Println(err)
		return
	}

	fmt.Println(resp.Header.Get("Content-Type")) //application/json;charset=UTF-8

	type Result struct {
		Msg    string
		Status string
		Obj    string
	}

	result := &Result{}
	json.Unmarshal(body, result) //解析json字符串

	if result.Status == "1" {
		fmt.Println(result.Msg)
	} else {
		fmt.Println("login error")
	}
	fmt.Println(result)
}
1.3、Post请求

如果使用http POST方法可以直接使用http.Post 或 http.PostForm


func main() {
	resp, err := http.Post("http://www.maimaiche.com/loginRegister/login.do",
		"application/x-www-form-urlencoded",
		strings.NewReader("mobile=xxxxxxxxxx&isRemberPwd=1"))
	if err != nil {
		fmt.Println(err)
		return
	}

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

	fmt.Println(string(body))
}
1.4、PostForm方法

用以提交表单并获得响应

func main() {

	postParam := url.Values{
		"mobile":      {"xxxxxx"},
		"isRemberPwd": {"1"},
	}

	resp, err := http.PostForm("http://www.maimaiche.com/loginRegister/login.do", postParam)
	if err != nil {
		fmt.Println(err)
		return
	}

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

	fmt.Println(string(body))
}
<think>我们正在处理一个Android系统构建错误,错误信息为:"Failed to build Android system: Error parsing directory for golang-protobuf/reflect/protoreflect - No such file or directory - Soong UI deps issue"。根据错误信息,问题可能出现在Soong构建系统在解析golang-protobuf相关目录时找不到文件或目录。 根据引用中提供的类似错误的解决方案(如引用[2]和引用[3]中关于node-sass的错误),我们可以尝试重新安装或重新生成相关依赖。此外,引用[4]中关于libvirt的错误通过重启相关服务解决,但我们的问题发生在构建过程中,因此可能需要重新生成构建环境或重新同步代码。 建议的解决步骤: 1. **清理构建环境**:尝试清理之前的构建输出,因为有时构建中间状态可能导致问题。 ```bash make clean ``` 或者,如果你使用的是Soong(Ninja)构建系统,可以删除out目录: ```bash rm -rf out/ ``` 2. **重新同步代码**:确保所有依赖的子模块和外部项目都正确同步。特别是golang-protobuf可能是一个外部依赖,需要确保它被正确下载。 ```bash repo sync -c -j4 ``` 3. **检查依赖项**:确保所有必要的构建依赖已经安装。特别是对于Go语言相关的依赖,可能需要检查GOPATH和GOROOT环境变量,但通常在AOSP构建中,这些都由构建系统管理。 4. **重新生成构建配置**:有时重新生成构建配置可以解决路径问题。 ```bash source build/envsetup.sh lunch <你的设备配置> make -j4 ``` 5. **检查特定模块**:如果问题仍然存在,可以尝试单独构建出错的模块(golang-protobuf)以获取更详细的错误信息。 ```bash make <golang-protobuf模块名> -j4 ``` 6. **检查文件系统权限**:确保构建用户对AOSP目录有足够的读写权限。 7. **检查磁盘空间**:确保有足够的磁盘空间完成构建。 8. **查看构建日志**:检查构建日志(通常在out/目录下)以获取更详细的错误信息。 如果以上步骤不能解决问题,可能需要检查AOSP代码库中是否有已知的问题或提交修复。可以查看AOSP的issue tracker或相关邮件列表。 注意:由于错误信息中提到了“Soong UI deps issue”,这可能是Soong构建系统的一个依赖解析问题。可以尝试更新Soong相关工具,或者检查是否有补丁需要应用。 由于问题具体涉及golang-protobuf,可以检查该依赖的路径是否正确。在AOSP中,golang-protobuf通常位于`external/golang-protobuf`目录下。确保该目录存在并且含必要的文件。 如果该目录不存在,可能是代码同步不完整,需要重新同步。 如果该目录存在,但构建系统仍然报错,可能是构建配置的问题。可以检查该目录下的Android.bp或Android.mk文件是否正确。 另外,根据引用[1]中关于Android错误的处理,有时文件路径错误可能是由于环境配置问题或脚本错误导致,检查构建脚本中传递的参数是否正确。 最后,如果问题仍然无法解决,可以考虑在AOSP社区寻求帮助,提供详细的构建环境和错误日志。 §§相关问题§§ 1. 如何调试Android构建系统中的Soong依赖问题? 2. 在构建Android系统时,如何确保所有外部依赖正确同步? 3. 有哪些常见的Android构建错误及其解决方法? 4. 如何为特定模块执行构建以获取详细错误信息?</think>### Android构建错误解决方案 您遇到的错误信息`Failed to build Android system: Error parsing directory for golang-protobuf/reflect/protoreflect - No such file or directory - Soong UI deps issue`表明Soong构建系统在解析Go语言protobuf依赖时出现路径问题。以下是系统性的解决方案: #### 解决步骤: 1. **清理构建缓存**(关键步骤): ```bash make clean # 或 rm -rf out/ rm -rf .soong/ ``` 构建缓存损坏是此类错误的常见原因[^2][^3]。 2. **重新同步依赖项**: ```bash repo sync -l # 仅同步本地必要文件 ./prebuilts/build-tools/path/linux-x86/bin/bpfix --all ``` 3. **检查protobuf依赖完整性**: ```bash ls external/golang-protobuf/reflect/protoreflect ``` 若目录不存在,需重新同步代码: ```bash repo sync external/golang-protobuf ``` 4. **验证环境配置**: ```bash source build/envsetup.sh lunch <target> make -j4 ``` 5. **检查文件权限**(若在Linux环境): ```bash sudo chown -R $(whoami) . find . -type d -exec chmod 755 {} \; ``` #### 根本原因分析: 1. **路径解析失败**:Soong构建系统无法定位`golang-protobuf`模块,通常由: - 不完整的代码同步 - 构建缓存损坏 - 文件权限问题导致[^4] 2. **环境不一致**: - 构建工具链版本不匹配 - 未正确执行`envsetup`初始化 3. **磁盘问题**: - 磁盘空间不足(建议预留150GB+) - 文件系统错误(可通过`fsck`检查) #### 预防措施: 1. 定期运行`repo sync -c`保持代码最新 2. 使用SSD存储加速构建过程 3. 在纯净环境中执行首次构建: ```bash docker run -it --rm -v $(pwd):/aosp android-build-trusty ``` > 若问题持续,检查`out/error.log`获取具体缺失路径,并验证`external/golang-protobuf`是否存在于代码库中[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BoringRong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值