{"id":127957,"date":"2020-06-11T21:10:12","date_gmt":"2020-06-11T13:10:12","guid":{"rendered":"http:\/\/4563.org\/?p=127957"},"modified":"2020-06-11T21:10:12","modified_gmt":"2020-06-11T13:10:12","slug":"%e9%80%82%e7%94%a8%e4%ba%8e-gin-%e5%92%8c-net-http-%e7%9a%84-gzip-%e4%b8%ad%e9%97%b4%e4%bb%b6%ef%bc%8c%e5%9f%ba%e4%ba%8e-content-type%e3%80%81content-length%e3%80%81%e6%89%a9%e5%b1%95%e5%90%8d","status":"publish","type":"post","link":"http:\/\/4563.org\/?p=127957","title":{"rendered":"\u9002\u7528\u4e8e Gin \u548c net\/http \u7684 gzip \u4e2d\u95f4\u4ef6\uff0c\u57fa\u4e8e Content-Type\u3001Content-Length\u3001\u6269\u5c55\u540d\u7b49\u8981\u7d20\u81ea\u52a8\u5224\u65ad\u662f\u5426\u542f\u7528\u538b\u7f29"},"content":{"rendered":"<div>\n<div>\n<div>\n<h1>                  \u9002\u7528\u4e8e Gin \u548c net\/http \u7684 gzip \u4e2d\u95f4\u4ef6\uff0c\u57fa\u4e8e Content-Type\u3001Content-Length\u3001\u6269\u5c55\u540d\u7b49\u8981\u7d20\u81ea\u52a8\u5224\u65ad\u662f\u5426\u542f\u7528\u538b\u7f29               <\/h1>\n<p> <\/p>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : nanmu42 <\/span>  <span><i><\/i> 64<\/span> <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div isfirst=\"1\"> <\/p>\n<h1>gzip \u4e2d\u95f4\u4ef6<\/h1>\n<p> <\/p>\n<h2>\u9879\u76ee\u5730\u5740\uff1a https:\/\/github.com\/nanmu42\/gzip<\/h2>\n<p>\u9002\u7528\u4e8eGin\u548cnet\/http\u7684 gzip \u4e2d\u95f4\u4ef6\u3002\u57fa\u4e8e <code>Content-Type<\/code>\u3001<code>Content-Length<\/code>\u3001\u6269\u5c55\u540d\u7b49\u8981\u7d20\u81ea\u52a8\u5224\u65ad\u662f\u5426\u542f\u7528\u538b\u7f29\u3002<\/p>\n<h1>\u4f7f\u7528\u793a\u4f8b<\/h1>\n<p> <\/p>\n<p><img decoding=\"async\" src=\"http:\/\/4563.org\/wp-content\/uploads\/2020\/06\/20200629_5ef9966e8f487.svg\" alt=\"\u9002\u7528\u4e8e Gin \u548c net\/http \u7684 gzip \u4e2d\u95f4\u4ef6\uff0c\u57fa\u4e8e Content-Type\u3001Content-Length\u3001\u6269\u5c55\u540d\u7b49\u8981\u7d20\u81ea\u52a8\u5224\u65ad\u662f\u5426\u542f\u7528\u538b\u7f29\" \/><\/p>\n<h2>Gin<\/h2>\n<pre><code>import github.com\/nanmu42\/gzip  func main() {  g := gin.Default()       \/\/ \u4f7f\u7528\u9ed8\u8ba4\u8bbe\u5b9a  g.Use(gzip.DefaultHandler().Gin)   g.GET(\"\/\", func(c *gin.Context) {   c.JSON( http.StatusOK, map[string]interface{}{    \"code\": 0,    \"msg\":  \"hello\",    \"data\": fmt.Sprintf(\"l%sng!\", strings.Repeat(\"o\", 1000)),   })  })   log.Println(g.Run(fmt.Sprintf(\":%d\", 3000))) } <\/code><\/pre>\n<h2>net\/http<\/h2>\n<pre><code>import github.com\/nanmu42\/gzip  func main() {  mux := http.NewServeMux()  mux.HandleFunc(\"\/\", func(w http.ResponseWriter, r *http.Request) {   writeString(w, fmt.Sprintf(\"This content is compressed: l%sng!\", strings.Repeat(\"o\", 1000)))  })      \/\/ \u4f7f\u7528\u9ed8\u8ba4\u8bbe\u5b9a  log.Println( http.ListenAndServe(fmt.Sprintf(\":%d\", 3001), gzip.DefaultHandler().WrapHandler(mux))) }  func writeString(w http.ResponseWriter, payload string) {  w.Header().Set(\"Content-Type\", \"text\/plain; charset=utf8\")  _, _ = io.WriteString(w, payload+\"n\") } <\/code><\/pre>\n<h2>\u5b9a\u5236<code>Handler<\/code><\/h2>\n<p>\u5728\u521b\u5efa<code>Handler<\/code>\u65f6\uff0c\u53ef\u4ee5\u5b9a\u5236\u53c2\u6570\u4ee5\u6ee1\u8db3\u4f60\u7684\u9700\u8981\uff1a<\/p>\n<pre><code>import github.com\/nanmu42\/gzip  handler := gzip.NewHandler(gzip.Config{     \/\/ gzip \u538b\u7f29\u7b49\u7ea7  CompressionLevel: 6,     \/\/ \u4f7f\u7528 gzip \u7684\u6700\u5c0f body \u4f53\u79ef\uff0c\u5355\u4f4d\uff1abyte  MinContentLength: 256,     \/\/ \u8bf7\u6c42\u8fc7\u6ee4\u5668\u57fa\u4e8e\u8bf7\u6c42\u6765\u5224\u65ad\u662f\u5426\u5bf9\u8fd9\u6761\u8bf7\u6c42\u7684\u8fd4\u56de\u542f\u7528 gzip\uff0c     \/\/ \u8fc7\u6ee4\u5668\u6309\u5176\u5b9a\u4e49\u987a\u5e8f\u6267\u884c\uff0c\u4e0b\u540c\u3002  RequestFilter: []RequestFilter{      NewCommonRequestFilter(),      DefaultExtensionFilter(),  },     \/\/ \u8fd4\u56de header \u8fc7\u6ee4\u5668\u57fa\u4e8e\u8fd4\u56de\u7684 header \u5224\u65ad\u662f\u5426\u5bf9\u8fd9\u6761\u8bf7\u6c42\u7684\u8fd4\u56de\u542f\u7528 gzip  ResponseHeaderFilter: []ResponseHeaderFilter{   NewSkipCompressedFilter(),   DefaultContentTypeFilter(),  }, }) <\/code><\/pre>\n<p><code>RequestFilter<\/code> \u548c <code>ResponseHeaderFilter<\/code> \u662f interface. \u4f60\u53ef\u4ee5\u5b9e\u73b0\u4f60\u81ea\u5df1\u7684\u8fc7\u6ee4\u5668\u3002<\/p>\n<h1>Handler \u7684\u5c40\u9650\u6027<\/h1>\n<p> <\/p>\n<ul>\n<li>\u603b\u662f\u5728\u8fd4\u56de\u4e2d\u63d0\u4f9b<code>Content-Type<\/code>\uff0cHandler \u4e0d\u4f1a\u5bf9\u672a\u77e5<code>Content-Type<\/code>\u7684\u8fd4\u56de\u8fdb\u884c\u7c7b\u578b\u731c\u6d4b\uff1b<\/li>\n<li>Handler \u4f1a\u5148\u5728\u8fd4\u56de\u7684 <code>Content-Length<\/code> \u4e2d\u67e5\u8be2 body \u4f53\u79ef\uff0c\u5982\u679c\u6ca1\u6709\u5c31\u518d\u67e5\u770b<code>http.ResponseWriter.Write(data []byte)<\/code>\u5728\u9996\u6b21\u8c03\u7528\u65f6\u7684 <code>len(data)<\/code>\u4f5c\u4e3a\u53c2\u8003\u3002\u5018\u82e5\u8fd4\u56de\u7684 <code>Content-Length<\/code>\u4e0d\u5b58\u5728\uff0c\u4e14<code>http.ResponseWriter.Write(data []byte)<\/code>\u9996\u6b21\u8c03\u7528\u65f6\u7684<code>len(data)<\/code>\u8f83\u5c0f\uff0c\u8fd9\u6761\u8fd4\u56de\u4f1a\u88ab\u9519\u8bef\u8ba4\u4e3a\u65e0\u9700\u538b\u7f29\u3002<\/li>\n<\/ul>\n<p>\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662f Gin \u7684<code>c.JSON()<\/code>\u6216<code>c.PureJSON()<\/code>\uff0c\u65e0\u9700\u62c5\u5fc3\u4e0a\u8ff0\u95ee\u9898\u3002<\/p>\n<p>\u5982\u679c\u4f60\u76f4\u63a5\u4f7f\u7528<code>net\/http<\/code>\uff0c\u8bf7\u59a5\u5584\u5904\u7406\u4e0a\u8ff0\u95ee\u9898\u3002<\/p>\n<\/p><\/div>\n<div> <b>\u5927\u4f6c\u6709\u8a71\u8aaa<\/b> (<span>2<\/span>)        <\/div>\n<div> <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<ul>\n<li data-pid=\"34046\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u8cc7\u6df1\u5927\u4f6c : missdeer <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             \u8ba9\u524d\u7f6e nginx \u5904\u7406\u5982\u4f55\uff1f                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li data-pid=\"34047\" data-uid=\"2\">\n<div>\n<div>\n<div> <span>\u4e3b<\/span> <span>\u8cc7\u6df1\u5927\u4f6c : nanmu42 <\/span>  <\/div>\n<div> <i title=\"\u5f15\u7528\"><\/i>  <span>          <\/span> <\/div>\n<\/p><\/div>\n<div>                                                             @missdeer \u5f53\u8fd4\u56de\u7684 JSON \u5927\u4e8e 2KB \u65f6\uff0cGolang \u4f1a\u4f7f\u7528 chunk \u7684\u5f62\u5f0f\u4f20\u8f93\uff0c\u8fd9\u4e2a\u65f6\u5019\u6ca1\u6709`Content-Length`\uff0cNginx \u7684 `ngx_http_gzip_module` \u7684 `gzip_min_length` \u4ec5\u4ece `Content-Length` \u5224\u65ad\u662f\u5426\u538b\u7f29\uff0c\u5bfc\u81f4\u5185\u5bb9\u4e0d\u88ab\u538b\u7f29\u3002                                                            <\/div>\n<\/p><\/div>\n<\/li>\n<li>\n","protected":false},"excerpt":{"rendered":"<p>\u9002\u7528\u4e8e Gin \u548c net\/htt&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[],"tags":[],"_links":{"self":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/127957"}],"collection":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=127957"}],"version-history":[{"count":0,"href":"http:\/\/4563.org\/index.php?rest_route=\/wp\/v2\/posts\/127957\/revisions"}],"wp:attachment":[{"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=127957"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=127957"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/4563.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=127957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}