http.get () возвращает «422 Unprocessable Entity» - PullRequest
0 голосов
/ 29 ноября 2018

Я написал программу go для запроса проблем в репозитории github "golang: go".Http.Get () отвечает статусом «200 OK».Затем я запрашиваю проблемы, созданные за последние 3 месяца, и http.Get () возвращает «422 Unprocessable Entity».Ниже приведена программа

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 для формирования запроса.

Я новичок в веб-программировании и не могу понять, где я ошибся при формированиивторой запрос.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Многие API, включая один из github , возвращают код состояния 422, когда клиент отправляет неверные данные.В вашем коде неправильный ввод генерируется строкой, которая объединяет два квалификатора без «разделителя».

Так что "repo:golang/go" + timeStr приведет к значению q, содержащему один объединенный квалификатор, который выглядитчто-то вроде этого:

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

Чтобы исправить ваш код, вам просто нужно добавить пробел между двумя квалификаторами, и ваш запрос должен работать.

q=url.QueryEscape("repo:golang/go " + timeStr)
0 голосов
/ 29 ноября 2018

Я использовал, как показано ниже, и это работает для меня, если я не уйду 2-й 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
0 голосов
/ 29 ноября 2018

две вещи, которые сработали для меня

1) поменять местами "from" и "to" в вашей timeStr

2) не использовать QueryEscape для timeStr, просто добавьте его вкак это

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

Не используйте амперсанд (я изначально отвечал этим), используйте знак плюс или пробел.См. https://help.github.com/articles/searching-issues-and-pull-requests/#search-by-when-an-issue-or-pull-request-was-created-or-last-updated для обновления синтаксиса

: при дальнейшем рассмотрении QueryEscape - хорошая идея!Кажется, по совпадению "просто работать"

...