美文网首页
【GO-网络通信】HTTTP Response代码片段

【GO-网络通信】HTTTP Response代码片段

作者: SS_c2e5 | 来源:发表于2020-02-21 11:28 被阅读0次

    只发送header

    package main
    import (
      "net/http"
    )
    func main() {
      http.HandleFunc("/", foo)
      http.ListenAndServe(":3000", nil)
    }
    func foo(w http.ResponseWriter, r *http.Request) {
      w.Header().Set("Server", "A Go Web Server")
      w.WriteHeader(200)
    }
    

    返回普通文本

    package main
    import (
      "net/http"
    )
    func main() {
      http.HandleFunc("/", foo)
      http.ListenAndServe(":3000", nil)
    }
    func foo(w http.ResponseWriter, r *http.Request) {
      w.Write([]byte("OK"))
    }
    

    返回JSON数据

    package main
    import (
      "encoding/json"
      "net/http"
    )
    type Profile struct {
      Name    string
      Hobbies []string
    }
    func main() {
      http.HandleFunc("/", foo)
      http.ListenAndServe(":3000", nil)
    }
    func foo(w http.ResponseWriter, r *http.Request) {
      profile := Profile{"Alex", []string{"snowboarding", "programming"}}
      js, err := json.Marshal(profile)
      if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
      }
      w.Header().Set("Content-Type", "application/json")
      w.Write(js)
    }
    

    返回XML数据

    package main
    import (
      "encoding/xml"
      "net/http"
    )
    type Profile struct {
      Name    string
      Hobbies []string `xml:"Hobbies>Hobby"`
    }
    func main() {
      http.HandleFunc("/", foo)
      http.ListenAndServe(":3000", nil)
    }
    func foo(w http.ResponseWriter, r *http.Request) {
      profile := Profile{"Alex", []string{"snowboarding", "programming"}}
      x, err := xml.MarshalIndent(profile, "", "  ")
      if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
      }
      w.Header().Set("Content-Type", "application/xml")
      w.Write(x)
    }
    

    文件服务

    package main
    import (
      "net/http"
      "path"
    )
    func main() {
      http.HandleFunc("/", foo)
      http.ListenAndServe(":3000", nil)
    }
    func foo(w http.ResponseWriter, r *http.Request) {
      // Assuming you want to serve a photo at 'images/foo.png'
      fp := path.Join("images", "foo.png")
      http.ServeFile(w, r, fp)
    }
    

    使用HTML模版
    模板文件:templates/index.html

    <h1>Hello { { .Name } }</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
    
    package main
    import (
      "html/template"
      "net/http"
      "path"
    )
    type Profile struct {
      Name    string
      Hobbies []string
    }
    func main() {
      http.HandleFunc("/", foo)
      http.ListenAndServe(":3000", nil)
    }
    func foo(w http.ResponseWriter, r *http.Request) {
      profile := Profile{"Alex", []string{"snowboarding", "programming"}}
      fp := path.Join("templates", "index.html")
      tmpl, err := template.ParseFiles(fp)
      if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
      }
      if err := tmpl.Execute(w, profile); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
      }
    }
    

    使用HTML模板生成字符串
    除了上面的把http.ResponseWriter作为模版的执行参数,还可以使用buffer得到渲染的结果。

    buf := new(bytes.Buffer)
    if err := tmpl.Execute(buf, profile); err != nil {
      http.Error(w, err.Error(), http.StatusInternalServerError)
    }
    templateString := buf.String()
    

    使用嵌套的模版
    文件:templates/layout.html

    <html>
      <head>
        <title>{ { template "title" . } } </title>
      </head>
      <body
        { { template "content" .  } }
      </body>
    </html>
    

    文件:templates/index.html

    { { define "title" } }An example layout{ { end } }
    { { define "content" } }
    <h1>Hello { { .Name } }</h1>
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
    { { end } }
    
    package main
    import (
      "html/template"
      "net/http"
      "path"
    )
    type Profile struct {
      Name    string
      Hobbies []string
    }
    func main() {
      http.HandleFunc("/", foo)
      http.ListenAndServe(":3000", nil)
    }
    func foo(w http.ResponseWriter, r *http.Request) {
      profile := Profile{"Alex", []string{"snowboarding", "programming"}}
      lp := path.Join("templates", "layout.html")
      fp := path.Join("templates", "index.html")
      // Note that the layout file must be the first parameter in ParseFiles
      tmpl, err := template.ParseFiles(lp, fp)
      if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
      }
      if err := tmpl.Execute(w, profile); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
      }
    }
    

    相关文章

      网友评论

          本文标题:【GO-网络通信】HTTTP Response代码片段

          本文链接:https://www.haomeiwen.com/subject/zdxcqhtx.html