http.get() returns“422 无法处理的实体”

http.get() returns "422 Unprocessable Entity"

我编写了一个 go 程序来查询 github 存储库 "golang:go" 中的问题。 http.Get() 以状态“200 OK”响应。 然后我查询过去 3 个月内创建的问题和 http.Get() returns“422 不可处理的实体”。下面是程序

import(
        "fmt"
        "time"
        "net/http"
        "net/url"
        )

func main() {
        var ret error
        var str string 

        q:=url.QueryEscape("repo:golang/go")
        fmt.Println("q:", q)
        urlStr := "https://api.github.com/search/issues" +"?q=" + q 
        fmt.Println("urlStr:", urlStr)
        resp, ret:= http.Get(urlStr)
        fmt.Println("ret :", ret, "resp.status :", resp.Status)

        timeStr := "created:"
        to := time.Now()
        from := to.AddDate(0, -3, 0)

        str = to.Format("2006-01-02")
        timeStr = timeStr + str + ".."
        fmt.Printf("time1 : %s\n", timeStr)

        str = from.Format("2006-01-02")
        timeStr = timeStr + str 
        fmt.Printf("time2 : %s\n", timeStr)

        q=url.QueryEscape("repo:golang/go" + timeStr)
        fmt.Println("q:", q)
        urlStr = "https://api.github.com/search/issues" +"?q=" + q 
        fmt.Println("urlStr:", urlStr)
        resp, ret = http.Get(urlStr)
        fmt.Println("ret :", ret, "resp.status :", resp.Status) 
}   

我使用 this 来形成查询。

我是网络编程的新手,无法理解我在形成第二个查询时哪里出错了。

两件事对我有用

1) 反转你的 timeStr

中的 "from" 和 "to"

2)不要在timeStr上使用QueryEscape,直接这样添加就可以了

   urlStr = "https://api.github.com/search/issues" + "?q=repo:golang/go+" + timeStr

不要使用和号(我最初是这样回答的)使用加号或 space。请参阅 https://help.github.com/articles/searching-issues-and-pull-requests/#search-by-when-an-issue-or-pull-request-was-created-or-last-updated 了解语法

更新:进一步考虑 QueryEscape 是个好主意!好像很巧"just work"

许多 API,包括 github return 客户端发送无效输入时的 422 状态代码。在您的代码中,错误的输入是由连接两个没有 "separator".

的限定符的行生成的

因此 "repo:golang/go" + timeStr 将导致 q 值包含单个 "merged" 限定符,如下所示:

"repo:golang/gocreated:2018-1...

要修复您的代码,您只需在两个限定符之间添加一个 space,您的查询就可以正常工作。

q=url.QueryEscape("repo:golang/go " + timeStr)

我像下面这样使用,如果我不转义第二个 url:

,它对我有用
package main
import(
        "fmt"
        "time"
        "net/http"
        "net/url"
        )

func main() {
        var ret error
        var str string 

        q:=url.QueryEscape("repo:golang/go")
        fmt.Println("q:", q)
        urlStr := "https://api.github.com/search/issues" +"?q=" + q 
        fmt.Println("urlStr:", urlStr)
        resp, ret:= http.Get(urlStr)
        fmt.Println("ret :", ret, "resp.status :", resp.Status)

        timeStr := "created:"
        to := time.Now()
        from := to.AddDate(0, -3, 0)

        str = to.Format("2006-01-02")
        timeStr = timeStr + str + ".."
        fmt.Printf("time1 : %s\n", timeStr)

        str = from.Format("2006-01-02")
        timeStr = timeStr + str 
        fmt.Printf("time2 : %s\n", timeStr)

        urlStr = "https://api.github.com/search/issues" +"?q=" + "repo:golang/go&created:2018-11-29..2018-08-29"
        fmt.Println("urlStr:", urlStr)
        resp, ret = http.Get(urlStr)
        fmt.Println("ret :", ret, "resp.status :", resp.Status) 
}

输出为:

q: repo%3Agolang%2Fgo
urlStr: https://api.github.com/search/issues?q=repo%3Agolang%2Fgo
ret : <nil> resp.status : 200 OK
time1 : created:2018-11-29..
time2 : created:2018-11-29..2018-08-29
urlStr: https://api.github.com/search/issues?q=repo:golang/go&created:2018-11-29..2018-08-29
ret : <nil> resp.status : 200 OK