我想以编程方式对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会看到错误。
答案 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....