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
我编写了一个 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