2016-10-16 5 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 자체 서명 인증서를 사용하고 있습니다 ... 그게 ' 내 질문과 관련이 없다. – vesche

+0

POST에서 현재 시도가 어떻게 작동하지 않는지 언급 한 경우 유용합니다. – superfell

답변

2

오류 메시지를 공유하지 않았지만 io.Reader이 필요하기 때문에 client.Post 호출에서 문자열이 세 번째 매개 변수로 허용되지 않는다고 가정합니다. 대신이 시도 : 서버 측에

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 
    } 
}) 

다른 문제점이 있습니다. index.html을 사용하면 아마도 여기에서 작동하지 않습니다. http.ServeFile은 해당 경로를 리디렉션합니다. https://golang.org/pkg/net/http/#ServeFile 참조 :

는 특별한 경우로, ServeFile이 r.URL.Path 가 동일한 경로에 "/index.html"이 끝나는 모든 요청을 리디렉션의 마지막 "index.html을"없이. 이러한 리디렉션을 방지하려면 경로를 수정하거나 ServeContent를 사용하십시오.

나는 그 문제를 피하기 위해 다른 파일 이름을 사용하는 것이 좋습니다.

+0

대단히 감사합니다! – vesche