2016-09-11 10 views
1

Dockerハブサービスに対してプログラムで認証します。コードを実行すると、404エラーが発生します。しかし、同じURLをCurlに渡すと、私は200を取得します。問題のデバッグ方法がわかりません。Go httpクライアントを使用する場合は

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 
} 

マイprint文の出力:

は、私は次のコードを使用

& {registry.docker.ioのwaisbrot /最新待ちを}

& {取得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 []}

年9月11日11時19分42秒404 0

:404ページ

を見つけていない。しかし示すURLはカールで404(またはWebブラウザで)を生成していないので、私は理由を理解していませんGoにエラーが表示されます。

答えて

6

"get"は有効な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.... 
を得る
関連する問題