2016-10-16 40 views
2

私はTLSでHTTP GETを行う単純なクライアント/サーバをGoに書いていますが、TLSでHTTP POSTを実行できるようにしようとしています。Golang HTTPS/TLS POSTクライアント/サーバ

以下の例では、index.htmlには、テキストhelloが含まれており、HTTP GETは正常に動作しています。私は、クライアントにHTTP GETを取得して、サーバにhello worldを書き戻したい。

クライアント

package main 

import (
    "crypto/tls" 
    "fmt" 
    "io/ioutil" 
    "net/http" 
    "strings" 
) 

func main() { 
    link := "https://10.0.0.1/static/index.html" 

    tr := &http.Transport{ 
     TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 
    } 
    client := &http.Client{Transport: tr} 
    response, err := client.Get(link) 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer response.Body.Close() 

    content, _ := ioutil.ReadAll(response.Body) 
    s := strings.TrimSpace(string(content)) 

    fmt.Println(s) 

    // out := s + " world"  
    // Not working POST... 
    // resp, err := client.Post(link, "text/plain", &out) 

} 

サーバー

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
) 

func main() { 
    http.HandleFunc("/static/", func (w http.ResponseWriter, r *http.Request) { 
     fmt.Println("Got connection!") 
     http.ServeFile(w, r, r.URL.Path[1:]) 
    }) 
    log.Fatal(http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)) 
} 

私はまた、現在サーバー側でPOSTを扱うことは何もないが、私はちょうど私が実行したとき、それはとても画面にそれをプリントアウトしたいですクライアントは私がサーバプリントhello worldを見るでしょう。

適切なPOSTを行うためにクライアントコードを修正する方法を教えてください。そして、対応するサーバーコードはPOSTを受け入れるためにどのように見えますか?私はHTTPS/TLS POSTの例を見つけるのに苦労しています。

+0

あなたの証明書のCAをあなたのトランスポートに追加する必要があります(http://stackoverflow.com/a/38825553/2604529) –

+0

@MarcelNovy私は自己署名証明書を使用しています...それdoesn '私の質問とは関係がありません。 – vesche

+0

POSTでの現在の試行がどのように機能しないかを述べた場合は役に立ちます。 – superfell

答えて

2

エラーメッセージを共有しませんでしたが、io.Readerが必要なため、client.Post呼び出しで3番目のパラメータとして文字列を使用できないと仮定します。これを代わりに試してみてください:

out := s + " world"  
resp, err := client.Post(link, "text/plain", bytes.NewBufferString(out)) 

サーバー側では、POSTリクエストを処理するための正しいコードが既に設定されています。方法を確認してください:

http.HandleFunc("/static/", func (w http.ResponseWriter, r *http.Request) { 
    if r.Method == "POST" { 
     // handle POST requests 
    } else { 
     // handle all other requests 
    } 
}) 

他にも1つの問題があります。 index.htmlを使用すると、おそらくここでは動作しません。 http.ServeFileはそのパスをリダイレクトします。 https://golang.org/pkg/net/http/#ServeFileを参照してください

特殊なケースとして、ServeFileは最終 「index.htmlを」なし、r.URL.Path 同じパスに「/index.htmlが」で終わるすべての要求をリダイレクトします。このようなリダイレクトを回避するには、パスを変更するか、 ServeContentを使用してください。

私はこの問題を避けるために別のファイル名を使用することをお勧めします。

+0

ありがとうございました! – vesche