Golang中不支持的协议方案问题探讨

Golang中不支持的协议方案问题探讨 我有一个以下URL,它返回JSON响应:

https://script.google.com/macros/s/AKfycbzw0TKWycxeB5sx1wIefAiEHeYQt2mVuM-NAZTccxedhyntdv8FvcUteOZ2k03wRHGE/exec?barcode=6287029390129

我尝试通过Go获取相同的输出,因此编写了以下代码:

package main

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

func main() {
	req, _ := http.NewRequest("GET", "https://script.google.com/macros/s/AKfycbzw0TKWycxeB5sx1wIefAiEHeYQt2mVuM-NAZTccxedhyntdv8FvcUteOZ2k03wRHGE/exec?", nil)

	q := req.URL.Query()
	q.Add("barcode", "6287029390129")
	//q.Add("another_thing", "foo & bar")
	req.URL.RawQuery = q.Encode()

	fmt.Println(req.URL.String())

	// url := "https://script.google.com/macros/s/AKfycbzw0TKWycxeB5sx1wIefAiEHeYQt2mVuM-NAZTccxedhyntdv8FvcUteOZ2k03wRHGE/exec?barcode=6287029390129"
	resp, err := http.Get(req.URL.RawQuery) //
	_ = req.URL.RawQuery
	if err != nil {
		log.Fatalln(err)
	}

	//We Read the response body on the line below.
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln(err)
	}
	//Convert the body to type string
	sb := string(body)
	log.Printf(sb)
}

但我得到了以下错误:

2009/11/10 23:00:00 Get "barcode=6287029390129": unsupported protocol scheme ""

更新 根据收到的一些评论,我将 resp, err := http.Get(req.URL.RawQuery) 改为:resp, err := http.Get(req.URL.String()),同时也尝试使用了:resp, err := http.DefaultClient.Do(req)

但这两种情况都出现了以下错误:

2009/11/10 23:00:00 Get "https://script.google.com/macros/s/AKfycbzw0TKWycxeB5sx1wIefAiEHeYQt2mVuM-NAZTccxedhyntdv8FvcUteOZ2k03wRHGE/exec?barcode=6287029390129": dial tcp: lookup script.google.com on 169.254.169.254:53: dial udp 169.254.169.254:53: connect: no route to host

更多关于Golang中不支持的协议方案问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中不支持的协议方案问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题出在 http.Get(req.URL.RawQuery) 这一行。RawQuery 只包含查询参数部分(如 barcode=6287029390129),而不是完整的 URL。以下是修正后的代码:

package main

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

func main() {
	req, err := http.NewRequest("GET", "https://script.google.com/macros/s/AKfycbzw0TKWycxeB5sx1wIefAiEHeYQt2mVuM-NAZTccxedhyntdv8FvcUteOZ2k03wRHGE/exec", nil)
	if err != nil {
		log.Fatalln(err)
	}

	q := req.URL.Query()
	q.Add("barcode", "6287029390129")
	req.URL.RawQuery = q.Encode()

	fmt.Println("完整URL:", req.URL.String())

	// 方法1:使用http.DefaultClient.Do(req)
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalln("请求失败:", err)
	}
	defer resp.Body.Close()

	// 方法2:直接使用http.Get(更简洁)
	// resp, err := http.Get(req.URL.String())
	// if err != nil {
	//     log.Fatalln(err)
	// }
	// defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatalln("读取响应失败:", err)
	}

	log.Printf("响应状态码: %d", resp.StatusCode)
	log.Printf("响应内容: %s", string(body))
}

关于第二个错误 no route to host,这是网络连接问题,不是代码问题。需要检查:

  1. 网络连接是否正常
  2. 防火墙或代理设置
  3. DNS解析是否正常

可以添加超时设置来调试:

client := &http.Client{
    Timeout: 30 * time.Second,
}

或者测试其他网站来确认网络连通性:

// 测试网络连通性
testResp, err := http.Get("https://httpbin.org/get")
if err != nil {
    log.Fatalln("网络连接测试失败:", err)
}
defer testResp.Body.Close()
log.Println("网络测试通过,状态码:", testResp.StatusCode)
回到顶部