go - 如何在 http.Get 请求中使用双引号和冒号作为查询字符串?

标签 go

我想发送这个休息电话......

GET http://search.maven.org/solrsearch/select?q=g:"ch.viascom.groundwork"+AND+a:"foxhttp"&rows=100&core=gav

...但不能,因为它被编码为

http://search.maven.org/solrsearch/select?core=gav&q=g%3A%22ch.viascom.groundwork%22%2BAND%2Ba%3A%22foxhttp%22&rows=20

这是我的 go 函数:

func searchOnMavenCentral() {
    var groupId = "ch.viascom.groundwork"
    var artifactId = "foxhttp"

    params := url.Values{}
    params.Add("q", `g:"` + groupId + `"+AND+a:"` + artifactId + `"`)
    params.Add("rows", "20")
    params.Add("core", "gav")

    resp, err := http.Get("http://search.maven.org/solrsearch/select?" + params.Encode())
    if err != nil {
        log.Fatalln(err)
    }

    log.Println(resp.Request.URL)
    log.Println(resp)
}

我该如何解决这个问题?提前感谢您的帮助!

更新状态

在您的帮助下,我设法创建了所需的 URL,但我现在面临以下新问题:

&{400 Bad Request 400 HTTP/1.1 1 1 map[Connection:[keep-alive] Date:[Mon, 05 Aug 2019 23:56:45 GMT] Server:[nginx/1.14.1]] 0xc00011a080 -1 [chunked] false false map[] 0xc0000d4000 <nil>}

这是更新后的代码:

func searchOnMavenCentral() {
    var groupId = "ch.viascom.groundwork"
    var artifactId = "foxhttp"

    qp := "q=g:\"" + groupId + `"+AND+a:"` + artifactId + `"` +
        "&rows=20" +
        "&core=gav"

    u := &url.URL{
        Scheme:   "http",
        Host:     "search.maven.org",
        Path:     "/solrsearch/select",
        RawQuery: qp,
    }

    resp, err := http.Get (u.String())
    if err != nil {
        log.Fatalln(err)
    }

    log.Println(resp.Request.URL)
    log.Println(resp)
}

最佳答案

鉴于服务器不处理百分比编码,使用基本的字符串操作来构造 URI。

要解决 net/http 包对 URL 的解码和编码问题,请使用 URL.Opaque 字段指定 URI。

func searchOnMavenCentral() {
    var groupId = "ch.viascom.groundwork"
    var artifactId = "foxhttp"

    qp := "q=g:\"" + groupId + `"+AND+a:"` + artifactId + `"` +
      "&rows=20" +
      "&core=gav"

    req, _ := http.NewRequest("GET", "http://search.maven.org", nil)
    req.URL = &url.URL{
       Scheme: req.URL.Scheme,
       Host: req.URL.Host,
       Opaque: "/solrsearch/select?" + qp,
    }
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Fatalln(err)
    }

    log.Println(resp.Request.URL)
    log.Println(resp)
}

关于go - 如何在 http.Get 请求中使用双引号和冒号作为查询字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57366475/

相关文章:

performance - []byte(string) 有多贵?

Go/Golang sql.DB 在函数中重用

linux - 为什么 trickle 实用程序不影响我的动态链接 golang 程序?

multithreading - 这个 Go 代码是线程安全的还是我需要一个互斥体?

go - 如何在protobuf中将自动生成的唯一ID字段设置为只读?

docker - "no such file or directory"带有 docker scratch 镜像

mongodb - Golang Mgo - 如何查看结果?

performance - 运行 Go 基准测试的正确输出

go - Scraper 按文本查找元素

Go 内存分配——新对象、指针和逃逸分析