404使用Go http客户端时

时间:2016-09-11 15:23:19

标签: go

我想以编程方式对Docker中心服务进行身份验证。当我运行我的代码时,我收到404错误。但是当我将相同的URL传递给Curl时,我得到了200.我不确定如何调试问题。

我使用以下代码:

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "strings"
    "time"
)

type Image struct {
    host, name, tag string
}

func authenticate(image Image) (token string) {
    var url = fmt.Sprintf("https://auth.docker.io/token?service=%s&scope=repository:%s:pull", image.host, image.name)
    var req, e1 = http.NewRequest("get", url, nil)
    if e1 != nil {
        log.Fatal(e1)
    }
    fmt.Println(req)
    var client = &http.Client{
        Timeout:       time.Second * 10,
        CheckRedirect: nil,
        Jar:           nil,
    }
    var res, e2 = client.Do(req)
    if e2 != nil {
        log.Fatal(e2)
    }
    var buf, e3 = ioutil.ReadAll(res.Body)
    if e3 != nil {
        log.Fatal(e3)
    }
    if res.StatusCode > 299 {
        log.Fatal(res.StatusCode, ": ", bytes.NewBuffer(buf).String())
    }
    type AuthResponse struct {
        token string
    }
    var authres AuthResponse
    fmt.Println(bytes.NewBuffer(buf).String())
    var e4 = json.Unmarshal(buf, &authres)
    if e4 != nil {
        log.Fatal(e4)
    }
    return authres.token
}

我的打印语句输出:

  

& {registry.docker.io waisbrot / wait latest}

     

& {get https://auth.docker.io/token?service=registry.docker.io&scope=repository:waisbrot/wait:pull HTTP / 1.1 1 1 map [] 0 [] false auth.docker.io map [] map [] map []}

     

2016/09/11 11:19:42 404:404页面未找到

但是显示的网址在Curl(或网页浏览器)中不会生成404,所以我不明白为什么Go会看到错误。

1 个答案:

答案 0 :(得分:6)

"获得"不是一个有效的HTTP方法,你想要" GET"或者在构造请求时使用http.MethodGet,例如

var req, e1 = http.NewRequest(http.MethodGet, url, nil)

随着这种变化我得到了成功的回应

&{GET https://auth.docker.io/token?service=registry.docker.io&scope=repository:waisbrot/wait:pull HTTP/1.1 1 1 map[] <nil> 0 [] false auth.docker.io map[] map[] <nil> map[]   <nil> <nil>}
{"token":"eyJhbGciOiJFUzI1N....