[{"data":1,"prerenderedAt":3614},["ShallowReactive",2],{"content:\u002F2026\u002F04\u002Fkratos-resp-proxy":3,"surround:\u002F2026\u002F04\u002Fkratos-resp-proxy":3605},{"id":4,"title":5,"body":6,"categories":3582,"date":3584,"description":3585,"draft":3586,"extension":3587,"image":3588,"meta":3589,"navigation":1656,"path":3591,"permalink":3588,"published":3588,"readingTime":3592,"recommend":3588,"references":3588,"seo":3597,"sitemap":3598,"stem":3599,"tags":3600,"type":3603,"updated":3584,"__hash__":3604},"content\u002Fposts\u002F2026\u002F04\u002Fkratos-resp-proxy.md","Kratos 自定义 HTTP 响应与错误处理",{"type":7,"value":8,"toc":3577},"minimark",[9,13,107,111,114,120,590,596,987,994,1052,1055,1551,1555,1588,1591,1594,1602,1605,1622,1631,1783,1786,1792,1885,1888,1901,1904,1949,1952,3573],[10,11,12],"p",{},"在我们的日常开发中，HTTP响应通常包含如下几个字段，但是kratos并没有去帮助我们封装这个响应体，而是靠我们手动构造",[14,15,20],"pre",{"className":16,"code":17,"language":18,"meta":19,"style":19},"language-json shiki shiki-themes github-light github-dark","{\n  success: true,\n  code: 200,\n  msg: \"success\",\n  data: []\n}\n","json","",[21,22,23,32,54,68,84,101],"code",{"__ignoreMap":19},[24,25,28],"span",{"class":26,"data-line":27,"line":27},"line",1,[24,29,31],{"class":30},"sSDpw","{\n",[24,33,35,39,43,47,51],{"class":26,"data-line":34,"line":34},2,[24,36,38],{"class":37},"indent","  ",[24,40,42],{"class":41},"s7hpK","success",[24,44,46],{"class":45},"sVt8B",": ",[24,48,50],{"class":49},"sj4cs","true",[24,52,53],{"class":45},",\n",[24,55,57,59,61,63,66],{"class":26,"data-line":56,"line":56},3,[24,58,38],{"class":37},[24,60,21],{"class":41},[24,62,46],{"class":45},[24,64,65],{"class":49},"200",[24,67,53],{"class":45},[24,69,71,73,76,78,82],{"class":26,"data-line":70,"line":70},4,[24,72,38],{"class":37},[24,74,75],{"class":41},"msg",[24,77,46],{"class":45},[24,79,81],{"class":80},"sZZnC","\"success\"",[24,83,53],{"class":45},[24,85,87,89,92,94,98],{"class":26,"data-line":86,"line":86},5,[24,88,38],{"class":37},[24,90,91],{"class":41},"data",[24,93,46],{"class":45},[24,95,97],{"class":96},"sJX2D","[",[24,99,100],{"class":96},"]\n",[24,102,104],{"class":26,"data-line":103,"line":103},6,[24,105,106],{"class":30},"}\n",[108,109,110],"h2",{"id":110},"常规响应",[10,112,113],{},"kratos没有统一的响应格式，都是我们程序员自定义的，如果说要更换相应格式，那么我们应该对其默认的响应结构体编码进行修改",[10,115,116,117],{},"默认使用的",[21,118,119],{"code":119},"DefaultResponseEncoder",[14,121,125],{"className":122,"code":123,"language":124,"meta":19,"style":19},"language-go shiki shiki-themes github-light github-dark","\u002F\u002F DefaultResponseEncoder encodes the object to the HTTP response.\nfunc DefaultResponseEncoder(w http.ResponseWriter, r *http.Request, v interface{}) error {\n        if v == nil {\n                return nil\n        }\n        if rd, ok := v.(Redirector); ok {\n                url, code := rd.Redirect()\n                http.Redirect(w, r, url, code)\n                return nil\n        }\n        codec, _ := CodecForRequest(r, \"Accept\")\n        data, err := codec.Marshal(v)\n        if err != nil {\n                return err\n        }\n        w.Header().Set(\"Content-Type\", httputil.ContentType(codec.Name()))\n        _, err = w.Write(data)\n        if err != nil {\n                return err\n        }\n        return nil\n}\n","go",[21,126,127,133,203,226,242,252,281,309,332,347,358,383,407,428,444,455,504,529,548,563,574,585],{"__ignoreMap":19},[24,128,129],{"class":26,"data-line":27,"line":27},[24,130,132],{"class":131},"sJ8bj","\u002F\u002F DefaultResponseEncoder encodes the object to the HTTP response.\n",[24,134,135,139,143,146,150,153,156,159,162,165,168,171,173,176,178,181,184,187,190,193,196,199,201],{"class":26,"data-line":34,"line":34},[24,136,138],{"class":137},"szBVR","func",[24,140,142],{"class":141},"sScJk"," DefaultResponseEncoder",[24,144,145],{"class":30},"(",[24,147,149],{"class":148},"s4XuR","w",[24,151,152],{"class":141}," http",[24,154,155],{"class":45},".",[24,157,158],{"class":141},"ResponseWriter",[24,160,161],{"class":45},", ",[24,163,164],{"class":148},"r",[24,166,167],{"class":137}," *",[24,169,170],{"class":141},"http",[24,172,155],{"class":45},[24,174,175],{"class":141},"Request",[24,177,161],{"class":45},[24,179,180],{"class":148},"v",[24,182,183],{"class":137}," interface",[24,185,186],{"class":96},"{",[24,188,189],{"class":96},"}",[24,191,192],{"class":30},")",[24,194,195],{"class":45}," ",[24,197,198],{"class":137},"error",[24,200,195],{"class":45},[24,202,31],{"class":30},[24,204,205,208,210,213,216,219,222,224],{"class":26,"data-line":56,"line":56},[24,206,207],{"class":37},"    ",[24,209,207],{"class":37},[24,211,212],{"class":137},"if",[24,214,215],{"class":45}," v ",[24,217,218],{"class":137},"==",[24,220,221],{"class":49}," nil",[24,223,195],{"class":45},[24,225,31],{"class":96},[24,227,228,230,232,234,236,239],{"class":26,"data-line":70,"line":70},[24,229,207],{"class":37},[24,231,207],{"class":37},[24,233,207],{"class":37},[24,235,207],{"class":37},[24,237,238],{"class":137},"return",[24,240,241],{"class":49}," nil\n",[24,243,244,246,248,250],{"class":26,"data-line":86,"line":86},[24,245,207],{"class":37},[24,247,207],{"class":37},[24,249,19],{"class":45},[24,251,106],{"class":96},[24,253,254,256,258,260,263,266,269,271,274,276,279],{"class":26,"data-line":103,"line":103},[24,255,207],{"class":37},[24,257,207],{"class":37},[24,259,212],{"class":137},[24,261,262],{"class":45}," rd, ok ",[24,264,265],{"class":137},":=",[24,267,268],{"class":45}," v.",[24,270,145],{"class":96},[24,272,273],{"class":141},"Redirector",[24,275,192],{"class":96},[24,277,278],{"class":45},"; ok ",[24,280,31],{"class":96},[24,282,284,286,288,290,292,295,297,300,303,306],{"class":26,"data-line":283,"line":283},7,[24,285,207],{"class":37},[24,287,207],{"class":37},[24,289,207],{"class":37},[24,291,207],{"class":37},[24,293,294],{"class":45},"url, code ",[24,296,265],{"class":137},[24,298,299],{"class":45}," rd.",[24,301,302],{"class":141},"Redirect",[24,304,145],{"class":305},"sqkie",[24,307,308],{"class":305},")\n",[24,310,312,314,316,318,320,323,325,327,330],{"class":26,"data-line":311,"line":311},8,[24,313,207],{"class":37},[24,315,207],{"class":37},[24,317,207],{"class":37},[24,319,207],{"class":37},[24,321,322],{"class":45},"http.",[24,324,302],{"class":141},[24,326,145],{"class":305},[24,328,329],{"class":45},"w, r, url, code",[24,331,308],{"class":305},[24,333,335,337,339,341,343,345],{"class":26,"data-line":334,"line":334},9,[24,336,207],{"class":37},[24,338,207],{"class":37},[24,340,207],{"class":37},[24,342,207],{"class":37},[24,344,238],{"class":137},[24,346,241],{"class":49},[24,348,350,352,354,356],{"class":26,"data-line":349,"line":349},10,[24,351,207],{"class":37},[24,353,207],{"class":37},[24,355,19],{"class":45},[24,357,106],{"class":96},[24,359,361,363,365,368,370,373,375,378,381],{"class":26,"data-line":360,"line":360},11,[24,362,207],{"class":37},[24,364,207],{"class":37},[24,366,367],{"class":45},"codec, _ ",[24,369,265],{"class":137},[24,371,372],{"class":141}," CodecForRequest",[24,374,145],{"class":96},[24,376,377],{"class":45},"r, ",[24,379,380],{"class":80},"\"Accept\"",[24,382,308],{"class":96},[24,384,386,388,390,393,395,398,401,403,405],{"class":26,"data-line":385,"line":385},12,[24,387,207],{"class":37},[24,389,207],{"class":37},[24,391,392],{"class":45},"data, err ",[24,394,265],{"class":137},[24,396,397],{"class":45}," codec.",[24,399,400],{"class":141},"Marshal",[24,402,145],{"class":96},[24,404,180],{"class":45},[24,406,308],{"class":96},[24,408,410,412,414,416,419,422,424,426],{"class":26,"data-line":409,"line":409},13,[24,411,207],{"class":37},[24,413,207],{"class":37},[24,415,212],{"class":137},[24,417,418],{"class":45}," err ",[24,420,421],{"class":137},"!=",[24,423,221],{"class":49},[24,425,195],{"class":45},[24,427,31],{"class":96},[24,429,431,433,435,437,439,441],{"class":26,"data-line":430,"line":430},14,[24,432,207],{"class":37},[24,434,207],{"class":37},[24,436,207],{"class":37},[24,438,207],{"class":37},[24,440,238],{"class":137},[24,442,443],{"class":45}," err\n",[24,445,447,449,451,453],{"class":26,"data-line":446,"line":446},15,[24,448,207],{"class":37},[24,450,207],{"class":37},[24,452,19],{"class":45},[24,454,106],{"class":96},[24,456,458,460,462,465,468,470,472,474,477,479,482,485,488,490,493,496,498,500,502],{"class":26,"data-line":457,"line":457},16,[24,459,207],{"class":37},[24,461,207],{"class":37},[24,463,464],{"class":45},"w.",[24,466,467],{"class":141},"Header",[24,469,145],{"class":96},[24,471,192],{"class":96},[24,473,155],{"class":45},[24,475,476],{"class":141},"Set",[24,478,145],{"class":96},[24,480,481],{"class":80},"\"Content-Type\"",[24,483,484],{"class":45},", httputil.",[24,486,487],{"class":141},"ContentType",[24,489,145],{"class":305},[24,491,492],{"class":45},"codec.",[24,494,495],{"class":141},"Name",[24,497,145],{"class":30},[24,499,192],{"class":30},[24,501,192],{"class":305},[24,503,308],{"class":96},[24,505,507,509,511,514,517,520,523,525,527],{"class":26,"data-line":506,"line":506},17,[24,508,207],{"class":37},[24,510,207],{"class":37},[24,512,513],{"class":45},"_, err ",[24,515,516],{"class":137},"=",[24,518,519],{"class":45}," w.",[24,521,522],{"class":141},"Write",[24,524,145],{"class":96},[24,526,91],{"class":45},[24,528,308],{"class":96},[24,530,532,534,536,538,540,542,544,546],{"class":26,"data-line":531,"line":531},18,[24,533,207],{"class":37},[24,535,207],{"class":37},[24,537,212],{"class":137},[24,539,418],{"class":45},[24,541,421],{"class":137},[24,543,221],{"class":49},[24,545,195],{"class":45},[24,547,31],{"class":96},[24,549,551,553,555,557,559,561],{"class":26,"data-line":550,"line":550},19,[24,552,207],{"class":37},[24,554,207],{"class":37},[24,556,207],{"class":37},[24,558,207],{"class":37},[24,560,238],{"class":137},[24,562,443],{"class":45},[24,564,566,568,570,572],{"class":26,"data-line":565,"line":565},20,[24,567,207],{"class":37},[24,569,207],{"class":37},[24,571,19],{"class":45},[24,573,106],{"class":96},[24,575,577,579,581,583],{"class":26,"data-line":576,"line":576},21,[24,578,207],{"class":37},[24,580,207],{"class":37},[24,582,238],{"class":137},[24,584,241],{"class":49},[24,586,588],{"class":26,"data-line":587,"line":587},22,[24,589,106],{"class":30},[10,591,592,593],{},"自定义",[21,594,595],{"code":595},"ResponseEncoder",[14,597,599],{"className":122,"code":598,"language":124,"meta":19,"style":19},"\u002F\u002F 自定义响应格式\nfunc ResponseEncoder(w http.ResponseWriter, r *http.Request, v interface{}) error {\n    if v == nil {\n        return nil\n    }\n    if rd, ok := v.(kratos_http.Redirector); ok {\n        url, code := rd.Redirect()\n        http.Redirect(w, r, url, code)\n        return nil\n    }\n    codec, _ := kratos_http.CodecForRequest(r, \"Accept\")\n    resp := &httpResponse{\n        Success: true,\n        Code:    200,\n        Msg:     \"success\",\n        Data:    v,\n    }\n    data, err := codec.Marshal(resp)\n    if err != nil {\n        return err\n    }\n    w.Header().Set(\"Content-Type\", \"application\u002F\"+codec.Name())\n    _, err = w.Write(data)\n    return err\n}\n",[21,600,601,606,655,671,681,689,716,734,750,760,768,790,807,820,833,846,855,863,882,898,908,916,954,973,982],{"__ignoreMap":19},[24,602,603],{"class":26,"data-line":27,"line":27},[24,604,605],{"class":131},"\u002F\u002F 自定义响应格式\n",[24,607,608,610,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653],{"class":26,"data-line":34,"line":34},[24,609,138],{"class":137},[24,611,612],{"class":141}," ResponseEncoder",[24,614,145],{"class":30},[24,616,149],{"class":148},[24,618,152],{"class":141},[24,620,155],{"class":45},[24,622,158],{"class":141},[24,624,161],{"class":45},[24,626,164],{"class":148},[24,628,167],{"class":137},[24,630,170],{"class":141},[24,632,155],{"class":45},[24,634,175],{"class":141},[24,636,161],{"class":45},[24,638,180],{"class":148},[24,640,183],{"class":137},[24,642,186],{"class":96},[24,644,189],{"class":96},[24,646,192],{"class":30},[24,648,195],{"class":45},[24,650,198],{"class":137},[24,652,195],{"class":45},[24,654,31],{"class":30},[24,656,657,659,661,663,665,667,669],{"class":26,"data-line":56,"line":56},[24,658,207],{"class":37},[24,660,212],{"class":137},[24,662,215],{"class":45},[24,664,218],{"class":137},[24,666,221],{"class":49},[24,668,195],{"class":45},[24,670,31],{"class":96},[24,672,673,675,677,679],{"class":26,"data-line":70,"line":70},[24,674,207],{"class":37},[24,676,207],{"class":37},[24,678,238],{"class":137},[24,680,241],{"class":49},[24,682,683,685,687],{"class":26,"data-line":86,"line":86},[24,684,207],{"class":37},[24,686,19],{"class":45},[24,688,106],{"class":96},[24,690,691,693,695,697,699,701,703,706,708,710,712,714],{"class":26,"data-line":103,"line":103},[24,692,207],{"class":37},[24,694,212],{"class":137},[24,696,262],{"class":45},[24,698,265],{"class":137},[24,700,268],{"class":45},[24,702,145],{"class":96},[24,704,705],{"class":141},"kratos_http",[24,707,155],{"class":45},[24,709,273],{"class":141},[24,711,192],{"class":96},[24,713,278],{"class":45},[24,715,31],{"class":96},[24,717,718,720,722,724,726,728,730,732],{"class":26,"data-line":283,"line":283},[24,719,207],{"class":37},[24,721,207],{"class":37},[24,723,294],{"class":45},[24,725,265],{"class":137},[24,727,299],{"class":45},[24,729,302],{"class":141},[24,731,145],{"class":305},[24,733,308],{"class":305},[24,735,736,738,740,742,744,746,748],{"class":26,"data-line":311,"line":311},[24,737,207],{"class":37},[24,739,207],{"class":37},[24,741,322],{"class":45},[24,743,302],{"class":141},[24,745,145],{"class":305},[24,747,329],{"class":45},[24,749,308],{"class":305},[24,751,752,754,756,758],{"class":26,"data-line":334,"line":334},[24,753,207],{"class":37},[24,755,207],{"class":37},[24,757,238],{"class":137},[24,759,241],{"class":49},[24,761,762,764,766],{"class":26,"data-line":349,"line":349},[24,763,207],{"class":37},[24,765,19],{"class":45},[24,767,106],{"class":96},[24,769,770,772,774,776,779,782,784,786,788],{"class":26,"data-line":360,"line":360},[24,771,207],{"class":37},[24,773,367],{"class":45},[24,775,265],{"class":137},[24,777,778],{"class":45}," kratos_http.",[24,780,781],{"class":141},"CodecForRequest",[24,783,145],{"class":96},[24,785,377],{"class":45},[24,787,380],{"class":80},[24,789,308],{"class":96},[24,791,792,794,797,799,802,805],{"class":26,"data-line":385,"line":385},[24,793,207],{"class":37},[24,795,796],{"class":45},"resp ",[24,798,265],{"class":137},[24,800,801],{"class":137}," &",[24,803,804],{"class":141},"httpResponse",[24,806,31],{"class":96},[24,808,809,811,813,816,818],{"class":26,"data-line":409,"line":409},[24,810,207],{"class":37},[24,812,207],{"class":37},[24,814,815],{"class":45},"Success: ",[24,817,50],{"class":49},[24,819,53],{"class":45},[24,821,822,824,826,829,831],{"class":26,"data-line":430,"line":430},[24,823,207],{"class":37},[24,825,207],{"class":37},[24,827,828],{"class":45},"Code:    ",[24,830,65],{"class":49},[24,832,53],{"class":45},[24,834,835,837,839,842,844],{"class":26,"data-line":446,"line":446},[24,836,207],{"class":37},[24,838,207],{"class":37},[24,840,841],{"class":45},"Msg:     ",[24,843,81],{"class":80},[24,845,53],{"class":45},[24,847,848,850,852],{"class":26,"data-line":457,"line":457},[24,849,207],{"class":37},[24,851,207],{"class":37},[24,853,854],{"class":45},"Data:    v,\n",[24,856,857,859,861],{"class":26,"data-line":506,"line":506},[24,858,207],{"class":37},[24,860,19],{"class":45},[24,862,106],{"class":96},[24,864,865,867,869,871,873,875,877,880],{"class":26,"data-line":531,"line":531},[24,866,207],{"class":37},[24,868,392],{"class":45},[24,870,265],{"class":137},[24,872,397],{"class":45},[24,874,400],{"class":141},[24,876,145],{"class":96},[24,878,879],{"class":45},"resp",[24,881,308],{"class":96},[24,883,884,886,888,890,892,894,896],{"class":26,"data-line":550,"line":550},[24,885,207],{"class":37},[24,887,212],{"class":137},[24,889,418],{"class":45},[24,891,421],{"class":137},[24,893,221],{"class":49},[24,895,195],{"class":45},[24,897,31],{"class":96},[24,899,900,902,904,906],{"class":26,"data-line":565,"line":565},[24,901,207],{"class":37},[24,903,207],{"class":37},[24,905,238],{"class":137},[24,907,443],{"class":45},[24,909,910,912,914],{"class":26,"data-line":576,"line":576},[24,911,207],{"class":37},[24,913,19],{"class":45},[24,915,106],{"class":96},[24,917,918,920,922,924,926,928,930,932,934,936,938,941,944,946,948,950,952],{"class":26,"data-line":587,"line":587},[24,919,207],{"class":37},[24,921,464],{"class":45},[24,923,467],{"class":141},[24,925,145],{"class":96},[24,927,192],{"class":96},[24,929,155],{"class":45},[24,931,476],{"class":141},[24,933,145],{"class":96},[24,935,481],{"class":80},[24,937,161],{"class":45},[24,939,940],{"class":80},"\"application\u002F\"",[24,942,943],{"class":137},"+",[24,945,492],{"class":45},[24,947,495],{"class":141},[24,949,145],{"class":305},[24,951,192],{"class":305},[24,953,308],{"class":96},[24,955,957,959,961,963,965,967,969,971],{"class":26,"data-line":956,"line":956},23,[24,958,207],{"class":37},[24,960,513],{"class":45},[24,962,516],{"class":137},[24,964,519],{"class":45},[24,966,522],{"class":141},[24,968,145],{"class":96},[24,970,91],{"class":45},[24,972,308],{"class":96},[24,974,976,978,980],{"class":26,"data-line":975,"line":975},24,[24,977,207],{"class":37},[24,979,238],{"class":137},[24,981,443],{"class":45},[24,983,985],{"class":26,"data-line":984,"line":984},25,[24,986,106],{"class":30},[10,988,989,990,993],{},"在",[21,991,992],{"code":992},"internal\u002Fserver\u002Fhttp.go","下添加配置",[14,995,997],{"className":122,"code":996,"language":124,"meta":19,"style":19},"\u002F\u002F 自定义响应体\nopts = append(opts, http.ResponseEncoder(ResponseEncoder))\nsrv := http.NewServer(opts...)\n",[21,998,999,1004,1029],{"__ignoreMap":19},[24,1000,1001],{"class":26,"data-line":27,"line":27},[24,1002,1003],{"class":131},"\u002F\u002F 自定义响应体\n",[24,1005,1006,1009,1011,1014,1016,1019,1021,1023,1025,1027],{"class":26,"data-line":34,"line":34},[24,1007,1008],{"class":45},"opts ",[24,1010,516],{"class":137},[24,1012,1013],{"class":141}," append",[24,1015,145],{"class":30},[24,1017,1018],{"class":45},"opts, http.",[24,1020,595],{"class":141},[24,1022,145],{"class":96},[24,1024,595],{"class":45},[24,1026,192],{"class":96},[24,1028,308],{"class":30},[24,1030,1031,1034,1036,1039,1042,1044,1047,1050],{"class":26,"data-line":56,"line":56},[24,1032,1033],{"class":45},"srv ",[24,1035,265],{"class":137},[24,1037,1038],{"class":45}," http.",[24,1040,1041],{"class":141},"NewServer",[24,1043,145],{"class":30},[24,1045,1046],{"class":45},"opts",[24,1048,1049],{"class":137},"...",[24,1051,308],{"class":30},[108,1053,1054],{"id":1054},"错误响应",[14,1056,1058],{"className":122,"code":1057,"language":124,"meta":19,"style":19},"\u002F\u002F 自定义错误格式\nfunc ErrorEncoder(w http.ResponseWriter, r *http.Request, err error) {\n\tresp := new(httpResponse)\n\t\u002F\u002F 如果能从kratos error解析出来, 则使用对应的code和message作为错误响应\n\tif gs, ok := status.FromError(err); ok {\n\t\tresp = &httpResponse{\n\t\t\tSuccess: false,\n\t\t\tCode:    kratos_status.FromGRPCCode(gs.Code()),\n\t\t\tMsg:     gs.Message(),\n\t\t\tData:    nil,\n\t\t}\n\t} else {\n\t\tresp = &httpResponse{\n\t\t\tSuccess: false,\n\t\t\tCode:    http.StatusInternalServerError,\n\t\t\tMsg:     err.Error(),\n\t\t\tData:    nil,\n\t\t}\n\t}\n\tcodec, _ := kratos_http.CodecForRequest(r, \"Accept\")\n\tbody, err := codec.Marshal(resp)\n\tif err != nil {\n\t\tw.WriteHeader(http.StatusInternalServerError)\n\t\treturn\n\t}\n\tw.Header().Set(\"Content-Type\", \"application\u002F\"+codec.Name())\n\tw.WriteHeader(resp.Code) \u002F\u002F 响应状态码\n\t_, _ = w.Write(body)\n}\n",[21,1059,1060,1065,1108,1126,1133,1160,1176,1191,1221,1241,1257,1267,1284,1300,1314,1325,1345,1359,1369,1377,1397,1416,1432,1450,1459,1467,1504,1525,1546],{"__ignoreMap":19},[24,1061,1062],{"class":26,"data-line":27,"line":27},[24,1063,1064],{"class":131},"\u002F\u002F 自定义错误格式\n",[24,1066,1067,1069,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096,1099,1102,1104,1106],{"class":26,"data-line":34,"line":34},[24,1068,138],{"class":137},[24,1070,1071],{"class":141}," ErrorEncoder",[24,1073,145],{"class":30},[24,1075,149],{"class":148},[24,1077,152],{"class":141},[24,1079,155],{"class":45},[24,1081,158],{"class":141},[24,1083,161],{"class":45},[24,1085,164],{"class":148},[24,1087,167],{"class":137},[24,1089,170],{"class":141},[24,1091,155],{"class":45},[24,1093,175],{"class":141},[24,1095,161],{"class":45},[24,1097,1098],{"class":148},"err",[24,1100,1101],{"class":137}," error",[24,1103,192],{"class":30},[24,1105,195],{"class":45},[24,1107,31],{"class":30},[24,1109,1110,1113,1115,1117,1120,1122,1124],{"class":26,"data-line":56,"line":56},[24,1111,1112],{"class":37},"\t",[24,1114,796],{"class":45},[24,1116,265],{"class":137},[24,1118,1119],{"class":141}," new",[24,1121,145],{"class":96},[24,1123,804],{"class":141},[24,1125,308],{"class":96},[24,1127,1128,1130],{"class":26,"data-line":70,"line":70},[24,1129,1112],{"class":37},[24,1131,1132],{"class":131},"\u002F\u002F 如果能从kratos error解析出来, 则使用对应的code和message作为错误响应\n",[24,1134,1135,1137,1139,1142,1144,1147,1150,1152,1154,1156,1158],{"class":26,"data-line":86,"line":86},[24,1136,1112],{"class":37},[24,1138,212],{"class":137},[24,1140,1141],{"class":45}," gs, ok ",[24,1143,265],{"class":137},[24,1145,1146],{"class":45}," status.",[24,1148,1149],{"class":141},"FromError",[24,1151,145],{"class":96},[24,1153,1098],{"class":45},[24,1155,192],{"class":96},[24,1157,278],{"class":45},[24,1159,31],{"class":96},[24,1161,1162,1164,1166,1168,1170,1172,1174],{"class":26,"data-line":103,"line":103},[24,1163,1112],{"class":37},[24,1165,1112],{"class":37},[24,1167,796],{"class":45},[24,1169,516],{"class":137},[24,1171,801],{"class":137},[24,1173,804],{"class":141},[24,1175,31],{"class":305},[24,1177,1178,1180,1182,1184,1186,1189],{"class":26,"data-line":283,"line":283},[24,1179,1112],{"class":37},[24,1181,1112],{"class":37},[24,1183,1112],{"class":37},[24,1185,815],{"class":45},[24,1187,1188],{"class":49},"false",[24,1190,53],{"class":45},[24,1192,1193,1195,1197,1199,1202,1205,1207,1210,1213,1215,1217,1219],{"class":26,"data-line":311,"line":311},[24,1194,1112],{"class":37},[24,1196,1112],{"class":37},[24,1198,1112],{"class":37},[24,1200,1201],{"class":45},"Code:    kratos_status.",[24,1203,1204],{"class":141},"FromGRPCCode",[24,1206,145],{"class":30},[24,1208,1209],{"class":45},"gs.",[24,1211,1212],{"class":141},"Code",[24,1214,145],{"class":96},[24,1216,192],{"class":96},[24,1218,192],{"class":30},[24,1220,53],{"class":45},[24,1222,1223,1225,1227,1229,1232,1235,1237,1239],{"class":26,"data-line":334,"line":334},[24,1224,1112],{"class":37},[24,1226,1112],{"class":37},[24,1228,1112],{"class":37},[24,1230,1231],{"class":45},"Msg:     gs.",[24,1233,1234],{"class":141},"Message",[24,1236,145],{"class":30},[24,1238,192],{"class":30},[24,1240,53],{"class":45},[24,1242,1243,1245,1247,1249,1252,1255],{"class":26,"data-line":349,"line":349},[24,1244,1112],{"class":37},[24,1246,1112],{"class":37},[24,1248,1112],{"class":37},[24,1250,1251],{"class":45},"Data:    ",[24,1253,1254],{"class":49},"nil",[24,1256,53],{"class":45},[24,1258,1259,1261,1263,1265],{"class":26,"data-line":360,"line":360},[24,1260,1112],{"class":37},[24,1262,1112],{"class":37},[24,1264,19],{"class":45},[24,1266,106],{"class":305},[24,1268,1269,1271,1273,1275,1277,1280,1282],{"class":26,"data-line":385,"line":385},[24,1270,1112],{"class":37},[24,1272,19],{"class":45},[24,1274,189],{"class":96},[24,1276,195],{"class":45},[24,1278,1279],{"class":137},"else",[24,1281,195],{"class":45},[24,1283,31],{"class":96},[24,1285,1286,1288,1290,1292,1294,1296,1298],{"class":26,"data-line":409,"line":409},[24,1287,1112],{"class":37},[24,1289,1112],{"class":37},[24,1291,796],{"class":45},[24,1293,516],{"class":137},[24,1295,801],{"class":137},[24,1297,804],{"class":141},[24,1299,31],{"class":305},[24,1301,1302,1304,1306,1308,1310,1312],{"class":26,"data-line":430,"line":430},[24,1303,1112],{"class":37},[24,1305,1112],{"class":37},[24,1307,1112],{"class":37},[24,1309,815],{"class":45},[24,1311,1188],{"class":49},[24,1313,53],{"class":45},[24,1315,1316,1318,1320,1322],{"class":26,"data-line":446,"line":446},[24,1317,1112],{"class":37},[24,1319,1112],{"class":37},[24,1321,1112],{"class":37},[24,1323,1324],{"class":45},"Code:    http.StatusInternalServerError,\n",[24,1326,1327,1329,1331,1333,1336,1339,1341,1343],{"class":26,"data-line":457,"line":457},[24,1328,1112],{"class":37},[24,1330,1112],{"class":37},[24,1332,1112],{"class":37},[24,1334,1335],{"class":45},"Msg:     err.",[24,1337,1338],{"class":141},"Error",[24,1340,145],{"class":30},[24,1342,192],{"class":30},[24,1344,53],{"class":45},[24,1346,1347,1349,1351,1353,1355,1357],{"class":26,"data-line":506,"line":506},[24,1348,1112],{"class":37},[24,1350,1112],{"class":37},[24,1352,1112],{"class":37},[24,1354,1251],{"class":45},[24,1356,1254],{"class":49},[24,1358,53],{"class":45},[24,1360,1361,1363,1365,1367],{"class":26,"data-line":531,"line":531},[24,1362,1112],{"class":37},[24,1364,1112],{"class":37},[24,1366,19],{"class":45},[24,1368,106],{"class":305},[24,1370,1371,1373,1375],{"class":26,"data-line":550,"line":550},[24,1372,1112],{"class":37},[24,1374,19],{"class":45},[24,1376,106],{"class":96},[24,1378,1379,1381,1383,1385,1387,1389,1391,1393,1395],{"class":26,"data-line":565,"line":565},[24,1380,1112],{"class":37},[24,1382,367],{"class":45},[24,1384,265],{"class":137},[24,1386,778],{"class":45},[24,1388,781],{"class":141},[24,1390,145],{"class":96},[24,1392,377],{"class":45},[24,1394,380],{"class":80},[24,1396,308],{"class":96},[24,1398,1399,1401,1404,1406,1408,1410,1412,1414],{"class":26,"data-line":576,"line":576},[24,1400,1112],{"class":37},[24,1402,1403],{"class":45},"body, err ",[24,1405,265],{"class":137},[24,1407,397],{"class":45},[24,1409,400],{"class":141},[24,1411,145],{"class":96},[24,1413,879],{"class":45},[24,1415,308],{"class":96},[24,1417,1418,1420,1422,1424,1426,1428,1430],{"class":26,"data-line":587,"line":587},[24,1419,1112],{"class":37},[24,1421,212],{"class":137},[24,1423,418],{"class":45},[24,1425,421],{"class":137},[24,1427,221],{"class":49},[24,1429,195],{"class":45},[24,1431,31],{"class":96},[24,1433,1434,1436,1438,1440,1443,1445,1448],{"class":26,"data-line":956,"line":956},[24,1435,1112],{"class":37},[24,1437,1112],{"class":37},[24,1439,464],{"class":45},[24,1441,1442],{"class":141},"WriteHeader",[24,1444,145],{"class":305},[24,1446,1447],{"class":45},"http.StatusInternalServerError",[24,1449,308],{"class":305},[24,1451,1452,1454,1456],{"class":26,"data-line":975,"line":975},[24,1453,1112],{"class":37},[24,1455,1112],{"class":37},[24,1457,1458],{"class":137},"return\n",[24,1460,1461,1463,1465],{"class":26,"data-line":984,"line":984},[24,1462,1112],{"class":37},[24,1464,19],{"class":45},[24,1466,106],{"class":96},[24,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502],{"class":26,"data-line":1469,"line":1469},26,[24,1471,1112],{"class":37},[24,1473,464],{"class":45},[24,1475,467],{"class":141},[24,1477,145],{"class":96},[24,1479,192],{"class":96},[24,1481,155],{"class":45},[24,1483,476],{"class":141},[24,1485,145],{"class":96},[24,1487,481],{"class":80},[24,1489,161],{"class":45},[24,1491,940],{"class":80},[24,1493,943],{"class":137},[24,1495,492],{"class":45},[24,1497,495],{"class":141},[24,1499,145],{"class":305},[24,1501,192],{"class":305},[24,1503,308],{"class":96},[24,1505,1507,1509,1511,1513,1515,1518,1520,1522],{"class":26,"data-line":1506,"line":1506},27,[24,1508,1112],{"class":37},[24,1510,464],{"class":45},[24,1512,1442],{"class":141},[24,1514,145],{"class":96},[24,1516,1517],{"class":45},"resp.Code",[24,1519,192],{"class":96},[24,1521,195],{"class":45},[24,1523,1524],{"class":131},"\u002F\u002F 响应状态码\n",[24,1526,1528,1530,1533,1535,1537,1539,1541,1544],{"class":26,"data-line":1527,"line":1527},28,[24,1529,1112],{"class":37},[24,1531,1532],{"class":45},"_, _ ",[24,1534,516],{"class":137},[24,1536,519],{"class":45},[24,1538,522],{"class":141},[24,1540,145],{"class":96},[24,1542,1543],{"class":45},"body",[24,1545,308],{"class":96},[24,1547,1549],{"class":26,"data-line":1548,"line":1548},29,[24,1550,106],{"class":30},[10,1552,989,1553,993],{},[21,1554,992],{"code":992},[14,1556,1558],{"className":122,"code":1557,"language":124,"meta":19,"style":19},"\u002F\u002F 自定义错误响应\nopts = append(opts, http.ErrorEncoder(ErrorEncoder))\n",[21,1559,1560,1565],{"__ignoreMap":19},[24,1561,1562],{"class":26,"data-line":27,"line":27},[24,1563,1564],{"class":131},"\u002F\u002F 自定义错误响应\n",[24,1566,1567,1569,1571,1573,1575,1577,1580,1582,1584,1586],{"class":26,"data-line":34,"line":34},[24,1568,1008],{"class":45},[24,1570,516],{"class":137},[24,1572,1013],{"class":141},[24,1574,145],{"class":30},[24,1576,1018],{"class":45},[24,1578,1579],{"class":141},"ErrorEncoder",[24,1581,145],{"class":96},[24,1583,1579],{"class":45},[24,1585,192],{"class":96},[24,1587,308],{"class":30},[10,1589,1590],{},"首先先解析错误，看看是否符合grpc格式，如果符合将原本在grpc中的Code和Message写入自定义的结构体当中，如果不符合则返回默认的状态码500，并且写入响应体body当中",[108,1592,1593],{"id":1593},"自定义错误状态码",[10,1595,1596],{},[1597,1598,1599],"a",{"href":1599,"rel":1600},"https:\u002F\u002Fgo-kratos.dev\u002Fzh-cn\u002Fdocs\u002Fcomponent\u002Ferrors\u002F",[1601],"nofollow",[10,1603,1604],{},"安装kratos错误处理相关的proto包",[14,1606,1610],{"className":1607,"code":1608,"language":1609,"meta":19,"style":19},"language-bash shiki shiki-themes github-light github-dark","go install github.com\u002Fgo-kratos\u002Fkratos\u002Fcmd\u002Fprotoc-gen-go-errors\u002Fv2@latest\n","bash",[21,1611,1612],{"__ignoreMap":19},[24,1613,1614,1616,1619],{"class":26,"data-line":27,"line":27},[24,1615,124],{"class":141},[24,1617,1618],{"class":80}," install",[24,1620,1621],{"class":80}," github.com\u002Fgo-kratos\u002Fkratos\u002Fcmd\u002Fprotoc-gen-go-errors\u002Fv2@latest\n",[10,1623,989,1624,1627,1628],{},[21,1625,1626],{"code":1626},"api\u002Fshortvid-service\u002Fv1","下新建",[21,1629,1630],{"code":1630},"errors.proto",[14,1632,1636],{"className":1633,"code":1634,"language":1635,"meta":19,"style":19},"language-proto shiki shiki-themes github-light github-dark","syntax = \"proto3\";\n\noption go_package = \"shortvid-backend\u002Fapi\u002Fshortvid-service\u002Fv1;v1\";\n\nimport \"errors\u002Ferrors.proto\";\n\nenum ErrorReason {\n    \u002F\u002F 设置缺省错误码\n    option (errors.default_code) = 500;\n    \n    \u002F\u002F 用户相关\n    USER_NOT_FOUND = 0 [(errors.code) = 404];\n}\n","proto",[21,1637,1638,1652,1658,1673,1677,1687,1691,1703,1710,1732,1738,1745,1779],{"__ignoreMap":19},[24,1639,1640,1643,1646,1649],{"class":26,"data-line":27,"line":27},[24,1641,1642],{"class":137},"syntax",[24,1644,1645],{"class":137}," =",[24,1647,1648],{"class":80}," \"proto3\"",[24,1650,1651],{"class":45},";\n",[24,1653,1654],{"class":26,"data-line":34,"line":34},[24,1655,1657],{"emptyLinePlaceholder":1656},true,"\n",[24,1659,1660,1663,1666,1668,1671],{"class":26,"data-line":56,"line":56},[24,1661,1662],{"class":137},"option",[24,1664,1665],{"class":49}," go_package",[24,1667,1645],{"class":137},[24,1669,1670],{"class":80}," \"shortvid-backend\u002Fapi\u002Fshortvid-service\u002Fv1;v1\"",[24,1672,1651],{"class":45},[24,1674,1675],{"class":26,"data-line":70,"line":70},[24,1676,1657],{"emptyLinePlaceholder":1656},[24,1678,1679,1682,1685],{"class":26,"data-line":86,"line":86},[24,1680,1681],{"class":137},"import",[24,1683,1684],{"class":80}," \"errors\u002Ferrors.proto\"",[24,1686,1651],{"class":45},[24,1688,1689],{"class":26,"data-line":103,"line":103},[24,1690,1657],{"emptyLinePlaceholder":1656},[24,1692,1693,1696,1699,1701],{"class":26,"data-line":283,"line":283},[24,1694,1695],{"class":137},"enum",[24,1697,1698],{"class":141}," ErrorReason",[24,1700,195],{"class":45},[24,1702,31],{"class":30},[24,1704,1705,1707],{"class":26,"data-line":311,"line":311},[24,1706,207],{"class":37},[24,1708,1709],{"class":131},"\u002F\u002F 设置缺省错误码\n",[24,1711,1712,1714,1716,1718,1720,1723,1725,1727,1730],{"class":26,"data-line":334,"line":334},[24,1713,207],{"class":37},[24,1715,1662],{"class":137},[24,1717,195],{"class":49},[24,1719,145],{"class":96},[24,1721,1722],{"class":49},"errors.default_code",[24,1724,192],{"class":96},[24,1726,1645],{"class":137},[24,1728,1729],{"class":49}," 500",[24,1731,1651],{"class":45},[24,1733,1734,1736],{"class":26,"data-line":349,"line":349},[24,1735,207],{"class":37},[24,1737],{"class":45},[24,1739,1740,1742],{"class":26,"data-line":360,"line":360},[24,1741,207],{"class":37},[24,1743,1744],{"class":131},"\u002F\u002F 用户相关\n",[24,1746,1747,1749,1752,1754,1757,1759,1761,1763,1766,1768,1771,1774,1777],{"class":26,"data-line":385,"line":385},[24,1748,207],{"class":37},[24,1750,1751],{"class":45},"USER_NOT_FOUND ",[24,1753,516],{"class":137},[24,1755,1756],{"class":49}," 0",[24,1758,195],{"class":45},[24,1760,97],{"class":96},[24,1762,145],{"class":305},[24,1764,1765],{"class":49},"errors.code",[24,1767,192],{"class":305},[24,1769,1770],{"class":45}," = ",[24,1772,1773],{"class":49},"404",[24,1775,1776],{"class":96},"]",[24,1778,1651],{"class":45},[24,1780,1781],{"class":26,"data-line":409,"line":409},[24,1782,106],{"class":30},[10,1784,1785],{},"然后生成对应的客户端代码",[10,1787,1788,1791],{},[21,1789,1790],{"code":1790},"Makefile","中写入",[14,1793,1797],{"className":1794,"code":1795,"language":1796,"meta":19,"style":19},"language-makefile shiki shiki-themes github-light github-dark",".PHONY: errors\n# errors\nerrors:\n        protoc --proto_path=. \\\n         --proto_path=.\u002Fthird_party \\\n         --go_out=paths=source_relative:. \\\n         --go-errors_out=paths=source_relative:. \\\n         $(API_PROTO_FILES)\n","makefile",[21,1798,1799,1807,1812,1820,1829,1843,1856,1869],{"__ignoreMap":19},[24,1800,1801,1804],{"class":26,"data-line":27,"line":27},[24,1802,1803],{"class":49},".PHONY",[24,1805,1806],{"class":45},": errors\n",[24,1808,1809],{"class":26,"data-line":34,"line":34},[24,1810,1811],{"class":131},"# errors\n",[24,1813,1814,1817],{"class":26,"data-line":56,"line":56},[24,1815,1816],{"class":141},"errors",[24,1818,1819],{"class":45},":\n",[24,1821,1822,1824,1826],{"class":26,"data-line":70,"line":70},[24,1823,207],{"class":37},[24,1825,207],{"class":37},[24,1827,1828],{"class":45},"protoc --proto_path=. \\\n",[24,1830,1831,1833,1835,1837,1840],{"class":26,"data-line":86,"line":86},[24,1832,207],{"class":37},[24,1834,207],{"class":37},[24,1836,195],{"class":37},[24,1838,1839],{"class":45},"--proto_path=.\u002Fthird_party ",[24,1841,1842],{"class":49},"\\\n",[24,1844,1845,1847,1849,1851,1854],{"class":26,"data-line":103,"line":103},[24,1846,207],{"class":37},[24,1848,207],{"class":37},[24,1850,195],{"class":37},[24,1852,1853],{"class":45},"--go_out=paths=source_relative:. ",[24,1855,1842],{"class":49},[24,1857,1858,1860,1862,1864,1867],{"class":26,"data-line":283,"line":283},[24,1859,207],{"class":37},[24,1861,207],{"class":37},[24,1863,195],{"class":37},[24,1865,1866],{"class":45},"--go-errors_out=paths=source_relative:. ",[24,1868,1842],{"class":49},[24,1870,1871,1873,1875,1877,1880,1883],{"class":26,"data-line":311,"line":311},[24,1872,207],{"class":37},[24,1874,207],{"class":37},[24,1876,195],{"class":37},[24,1878,1879],{"class":80},"$(",[24,1881,1882],{"class":45},"API_PROTO_FILES",[24,1884,308],{"class":80},[10,1886,1887],{},"然后执行",[14,1889,1891],{"className":1607,"code":1890,"language":1609,"meta":19,"style":19},"make errors\n",[21,1892,1893],{"__ignoreMap":19},[24,1894,1895,1898],{"class":26,"data-line":27,"line":27},[24,1896,1897],{"class":141},"make",[24,1899,1900],{"class":80}," errors\n",[10,1902,1903],{},"在service层使用自定义的枚举错误常量",[14,1905,1907],{"className":122,"code":1906,"language":124,"meta":19,"style":19},"if userModel == nil {\n    return nil, v1.ErrorUserNotFound(\"user not found\")\n}\n",[21,1908,1909,1924,1945],{"__ignoreMap":19},[24,1910,1911,1913,1916,1918,1920,1922],{"class":26,"data-line":27,"line":27},[24,1912,212],{"class":137},[24,1914,1915],{"class":45}," userModel ",[24,1917,218],{"class":137},[24,1919,221],{"class":49},[24,1921,195],{"class":45},[24,1923,31],{"class":30},[24,1925,1926,1928,1930,1932,1935,1938,1940,1943],{"class":26,"data-line":34,"line":34},[24,1927,207],{"class":37},[24,1929,238],{"class":137},[24,1931,221],{"class":49},[24,1933,1934],{"class":45},", v1.",[24,1936,1937],{"class":141},"ErrorUserNotFound",[24,1939,145],{"class":96},[24,1941,1942],{"class":80},"\"user not found\"",[24,1944,308],{"class":96},[24,1946,1947],{"class":26,"data-line":56,"line":56},[24,1948,106],{"class":30},[10,1950,1951],{},"完整代码",[14,1953,1955],{"className":122,"code":1954,"language":124,"meta":19,"style":19},"server\u002Fencoder.go\npackage server\n\nimport (\n    \"net\u002Fhttp\"\n\n    kratos_http \"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Ftransport\u002Fhttp\"\n    kratos_status \"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Ftransport\u002Fhttp\u002Fstatus\"\n    \"google.golang.org\u002Fgrpc\u002Fstatus\"\n)\n\ntype httpResponse struct {\n    Success bool   `json:\"success\"`\n    Code    int    `json:\"code\"`\n    Msg     string `json:\"msg\"`\n    Data    any    `json:\"data,omitempty\"`\n}\n\n\u002F\u002F 自定义响应格式\nfunc ResponseEncoder(w http.ResponseWriter, r *http.Request, v interface{}) error {\n    if v == nil {\n        return nil\n    }\n    if rd, ok := v.(kratos_http.Redirector); ok {\n        url, code := rd.Redirect()\n        http.Redirect(w, r, url, code)\n        return nil\n    }\n    codec, _ := kratos_http.CodecForRequest(r, \"Accept\")\n    resp := &httpResponse{\n        Success: true,\n        Code:    200,\n        Msg:     \"success\",\n        Data:    v,\n    }\n    data, err := codec.Marshal(resp)\n    if err != nil {\n        return err\n    }\n    w.Header().Set(\"Content-Type\", \"application\u002F\"+codec.Name())\n    _, err = w.Write(data)\n    return err\n}\n\n\u002F\u002F 自定义错误格式\nfunc ErrorEncoder(w http.ResponseWriter, r *http.Request, err error) {\n    resp := new(httpResponse)\n    if gs, ok := status.FromError(err); ok {\n        resp = &httpResponse{\n            Success: false,\n            Code:    kratos_status.FromGRPCCode(gs.Code()),\n            Msg:     gs.Message(),\n            Data:    nil,\n        }\n    } else {\n        resp = &httpResponse{\n            Success: false,\n            Code:    http.StatusInternalServerError,\n            Msg:     err.Error(),\n            Data:    nil,\n        }\n    }\n    codec, _ := kratos_http.CodecForRequest(r, \"Accept\")\n    body, err := codec.Marshal(resp)\n    if err != nil {\n        w.WriteHeader(http.StatusInternalServerError)\n        return\n    }\n    w.Header().Set(\"Content-Type\", \"application\u002F\"+codec.Name())\n    w.WriteHeader(resp.Code) \u002F\u002F 响应状态码\n    _, _ = w.Write(body)\n}\nserver\u002Fhttp.go\npackage server\n\nimport (\n    v1 \"shortvid-backend\u002Fapi\u002Fshortvid-service\u002Fv1\"\n    \"shortvid-backend\u002Fapp\u002Fshortvid-service\u002Finternal\u002Fconf\"\n    \"shortvid-backend\u002Fapp\u002Fshortvid-service\u002Finternal\u002Fservice\"\n\n    \"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Flog\"\n    \"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Fmiddleware\u002Frecovery\"\n    \"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Ftransport\u002Fhttp\"\n)\n\n\u002F\u002F NewHTTPServer new an HTTP server.\nfunc NewHTTPServer(c *conf.Server, users *service.UsersService, logger log.Logger) *http.Server {\n    var opts = []http.ServerOption{\n        http.Middleware(\n            recovery.Recovery(),\n        ),\n    }\n    if c.Http.Network != \"\" {\n        opts = append(opts, http.Network(c.Http.Network))\n    }\n    if c.Http.Addr != \"\" {\n        opts = append(opts, http.Address(c.Http.Addr))\n    }\n    if c.Http.Timeout != nil {\n        opts = append(opts, http.Timeout(c.Http.Timeout.AsDuration()))\n    }\n\n    \u002F\u002F 自定义响应格式\n    opts = append(opts, http.ResponseEncoder(ResponseEncoder))\n    opts = append(opts, http.ErrorEncoder(ErrorEncoder))\n\n    srv := http.NewServer(opts...)\n    v1.RegisterUsersServiceHTTPServer(srv, users)\n    return srv\n}\n",[21,1956,1957,1971,1979,1983,1992,2005,2009,2023,2037,2048,2052,2056,2071,2084,2097,2110,2123,2127,2131,2135,2183,2199,2209,2217,2243,2261,2277,2287,2295,2315,2330,2343,2356,2369,2378,2387,2406,2423,2434,2443,2480,2499,2508,2513,2518,2523,2564,2581,2606,2623,2638,2665,2684,2699,2710,2727,2744,2759,2770,2789,2804,2815,2824,2845,2864,2881,2898,2907,2916,2953,2972,2991,2996,3007,3014,3019,3028,3043,3055,3067,3072,3084,3096,3107,3112,3117,3123,3191,3219,3233,3254,3267,3276,3295,3324,3333,3351,3380,3389,3407,3443,3452,3457,3464,3489,3514,3519,3540,3558,3568],{"__ignoreMap":19},[24,1958,1959,1962,1965,1968],{"class":26,"data-line":27,"line":27},[24,1960,1961],{"class":45},"server",[24,1963,1964],{"class":137},"\u002F",[24,1966,1967],{"class":45},"encoder.",[24,1969,1970],{"class":137},"go\n",[24,1972,1973,1976],{"class":26,"data-line":34,"line":34},[24,1974,1975],{"class":137},"package",[24,1977,1978],{"class":141}," server\n",[24,1980,1981],{"class":26,"data-line":56,"line":56},[24,1982,1657],{"emptyLinePlaceholder":1656},[24,1984,1985,1987,1989],{"class":26,"data-line":70,"line":70},[24,1986,1681],{"class":137},[24,1988,195],{"class":45},[24,1990,1991],{"class":30},"(\n",[24,1993,1994,1996,1999,2002],{"class":26,"data-line":86,"line":86},[24,1995,207],{"class":37},[24,1997,1998],{"class":80},"\"",[24,2000,2001],{"class":141},"net\u002Fhttp",[24,2003,2004],{"class":80},"\"\n",[24,2006,2007],{"class":26,"data-line":103,"line":103},[24,2008,1657],{"emptyLinePlaceholder":1656},[24,2010,2011,2013,2016,2018,2021],{"class":26,"data-line":283,"line":283},[24,2012,207],{"class":37},[24,2014,2015],{"class":45},"kratos_http ",[24,2017,1998],{"class":80},[24,2019,2020],{"class":141},"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Ftransport\u002Fhttp",[24,2022,2004],{"class":80},[24,2024,2025,2027,2030,2032,2035],{"class":26,"data-line":311,"line":311},[24,2026,207],{"class":37},[24,2028,2029],{"class":45},"kratos_status ",[24,2031,1998],{"class":80},[24,2033,2034],{"class":141},"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Ftransport\u002Fhttp\u002Fstatus",[24,2036,2004],{"class":80},[24,2038,2039,2041,2043,2046],{"class":26,"data-line":334,"line":334},[24,2040,207],{"class":37},[24,2042,1998],{"class":80},[24,2044,2045],{"class":141},"google.golang.org\u002Fgrpc\u002Fstatus",[24,2047,2004],{"class":80},[24,2049,2050],{"class":26,"data-line":349,"line":349},[24,2051,308],{"class":30},[24,2053,2054],{"class":26,"data-line":360,"line":360},[24,2055,1657],{"emptyLinePlaceholder":1656},[24,2057,2058,2061,2064,2067,2069],{"class":26,"data-line":385,"line":385},[24,2059,2060],{"class":137},"type",[24,2062,2063],{"class":141}," httpResponse",[24,2065,2066],{"class":137}," struct",[24,2068,195],{"class":45},[24,2070,31],{"class":30},[24,2072,2073,2075,2078,2081],{"class":26,"data-line":409,"line":409},[24,2074,207],{"class":37},[24,2076,2077],{"class":45},"Success ",[24,2079,2080],{"class":137},"bool",[24,2082,2083],{"class":80},"   `json:\"success\"`\n",[24,2085,2086,2088,2091,2094],{"class":26,"data-line":430,"line":430},[24,2087,207],{"class":37},[24,2089,2090],{"class":45},"Code    ",[24,2092,2093],{"class":137},"int",[24,2095,2096],{"class":80},"    `json:\"code\"`\n",[24,2098,2099,2101,2104,2107],{"class":26,"data-line":446,"line":446},[24,2100,207],{"class":37},[24,2102,2103],{"class":45},"Msg     ",[24,2105,2106],{"class":137},"string",[24,2108,2109],{"class":80}," `json:\"msg\"`\n",[24,2111,2112,2114,2117,2120],{"class":26,"data-line":457,"line":457},[24,2113,207],{"class":37},[24,2115,2116],{"class":45},"Data    ",[24,2118,2119],{"class":141},"any",[24,2121,2122],{"class":80},"    `json:\"data,omitempty\"`\n",[24,2124,2125],{"class":26,"data-line":506,"line":506},[24,2126,106],{"class":30},[24,2128,2129],{"class":26,"data-line":531,"line":531},[24,2130,1657],{"emptyLinePlaceholder":1656},[24,2132,2133],{"class":26,"data-line":550,"line":550},[24,2134,605],{"class":131},[24,2136,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181],{"class":26,"data-line":565,"line":565},[24,2138,138],{"class":137},[24,2140,612],{"class":141},[24,2142,145],{"class":30},[24,2144,149],{"class":148},[24,2146,152],{"class":141},[24,2148,155],{"class":45},[24,2150,158],{"class":141},[24,2152,161],{"class":45},[24,2154,164],{"class":148},[24,2156,167],{"class":137},[24,2158,170],{"class":141},[24,2160,155],{"class":45},[24,2162,175],{"class":141},[24,2164,161],{"class":45},[24,2166,180],{"class":148},[24,2168,183],{"class":137},[24,2170,186],{"class":96},[24,2172,189],{"class":96},[24,2174,192],{"class":30},[24,2176,195],{"class":45},[24,2178,198],{"class":137},[24,2180,195],{"class":45},[24,2182,31],{"class":30},[24,2184,2185,2187,2189,2191,2193,2195,2197],{"class":26,"data-line":576,"line":576},[24,2186,207],{"class":37},[24,2188,212],{"class":137},[24,2190,215],{"class":45},[24,2192,218],{"class":137},[24,2194,221],{"class":49},[24,2196,195],{"class":45},[24,2198,31],{"class":96},[24,2200,2201,2203,2205,2207],{"class":26,"data-line":587,"line":587},[24,2202,207],{"class":37},[24,2204,207],{"class":37},[24,2206,238],{"class":137},[24,2208,241],{"class":49},[24,2210,2211,2213,2215],{"class":26,"data-line":956,"line":956},[24,2212,207],{"class":37},[24,2214,19],{"class":45},[24,2216,106],{"class":96},[24,2218,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2241],{"class":26,"data-line":975,"line":975},[24,2220,207],{"class":37},[24,2222,212],{"class":137},[24,2224,262],{"class":45},[24,2226,265],{"class":137},[24,2228,268],{"class":45},[24,2230,145],{"class":96},[24,2232,705],{"class":141},[24,2234,155],{"class":45},[24,2236,273],{"class":141},[24,2238,192],{"class":96},[24,2240,278],{"class":45},[24,2242,31],{"class":96},[24,2244,2245,2247,2249,2251,2253,2255,2257,2259],{"class":26,"data-line":984,"line":984},[24,2246,207],{"class":37},[24,2248,207],{"class":37},[24,2250,294],{"class":45},[24,2252,265],{"class":137},[24,2254,299],{"class":45},[24,2256,302],{"class":141},[24,2258,145],{"class":305},[24,2260,308],{"class":305},[24,2262,2263,2265,2267,2269,2271,2273,2275],{"class":26,"data-line":1469,"line":1469},[24,2264,207],{"class":37},[24,2266,207],{"class":37},[24,2268,322],{"class":45},[24,2270,302],{"class":141},[24,2272,145],{"class":305},[24,2274,329],{"class":45},[24,2276,308],{"class":305},[24,2278,2279,2281,2283,2285],{"class":26,"data-line":1506,"line":1506},[24,2280,207],{"class":37},[24,2282,207],{"class":37},[24,2284,238],{"class":137},[24,2286,241],{"class":49},[24,2288,2289,2291,2293],{"class":26,"data-line":1527,"line":1527},[24,2290,207],{"class":37},[24,2292,19],{"class":45},[24,2294,106],{"class":96},[24,2296,2297,2299,2301,2303,2305,2307,2309,2311,2313],{"class":26,"data-line":1548,"line":1548},[24,2298,207],{"class":37},[24,2300,367],{"class":45},[24,2302,265],{"class":137},[24,2304,778],{"class":45},[24,2306,781],{"class":141},[24,2308,145],{"class":96},[24,2310,377],{"class":45},[24,2312,380],{"class":80},[24,2314,308],{"class":96},[24,2316,2318,2320,2322,2324,2326,2328],{"class":26,"data-line":2317,"line":2317},30,[24,2319,207],{"class":37},[24,2321,796],{"class":45},[24,2323,265],{"class":137},[24,2325,801],{"class":137},[24,2327,804],{"class":141},[24,2329,31],{"class":96},[24,2331,2333,2335,2337,2339,2341],{"class":26,"data-line":2332,"line":2332},31,[24,2334,207],{"class":37},[24,2336,207],{"class":37},[24,2338,815],{"class":45},[24,2340,50],{"class":49},[24,2342,53],{"class":45},[24,2344,2346,2348,2350,2352,2354],{"class":26,"data-line":2345,"line":2345},32,[24,2347,207],{"class":37},[24,2349,207],{"class":37},[24,2351,828],{"class":45},[24,2353,65],{"class":49},[24,2355,53],{"class":45},[24,2357,2359,2361,2363,2365,2367],{"class":26,"data-line":2358,"line":2358},33,[24,2360,207],{"class":37},[24,2362,207],{"class":37},[24,2364,841],{"class":45},[24,2366,81],{"class":80},[24,2368,53],{"class":45},[24,2370,2372,2374,2376],{"class":26,"data-line":2371,"line":2371},34,[24,2373,207],{"class":37},[24,2375,207],{"class":37},[24,2377,854],{"class":45},[24,2379,2381,2383,2385],{"class":26,"data-line":2380,"line":2380},35,[24,2382,207],{"class":37},[24,2384,19],{"class":45},[24,2386,106],{"class":96},[24,2388,2390,2392,2394,2396,2398,2400,2402,2404],{"class":26,"data-line":2389,"line":2389},36,[24,2391,207],{"class":37},[24,2393,392],{"class":45},[24,2395,265],{"class":137},[24,2397,397],{"class":45},[24,2399,400],{"class":141},[24,2401,145],{"class":96},[24,2403,879],{"class":45},[24,2405,308],{"class":96},[24,2407,2409,2411,2413,2415,2417,2419,2421],{"class":26,"data-line":2408,"line":2408},37,[24,2410,207],{"class":37},[24,2412,212],{"class":137},[24,2414,418],{"class":45},[24,2416,421],{"class":137},[24,2418,221],{"class":49},[24,2420,195],{"class":45},[24,2422,31],{"class":96},[24,2424,2426,2428,2430,2432],{"class":26,"data-line":2425,"line":2425},38,[24,2427,207],{"class":37},[24,2429,207],{"class":37},[24,2431,238],{"class":137},[24,2433,443],{"class":45},[24,2435,2437,2439,2441],{"class":26,"data-line":2436,"line":2436},39,[24,2438,207],{"class":37},[24,2440,19],{"class":45},[24,2442,106],{"class":96},[24,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478],{"class":26,"data-line":2445,"line":2445},40,[24,2447,207],{"class":37},[24,2449,464],{"class":45},[24,2451,467],{"class":141},[24,2453,145],{"class":96},[24,2455,192],{"class":96},[24,2457,155],{"class":45},[24,2459,476],{"class":141},[24,2461,145],{"class":96},[24,2463,481],{"class":80},[24,2465,161],{"class":45},[24,2467,940],{"class":80},[24,2469,943],{"class":137},[24,2471,492],{"class":45},[24,2473,495],{"class":141},[24,2475,145],{"class":305},[24,2477,192],{"class":305},[24,2479,308],{"class":96},[24,2481,2483,2485,2487,2489,2491,2493,2495,2497],{"class":26,"data-line":2482,"line":2482},41,[24,2484,207],{"class":37},[24,2486,513],{"class":45},[24,2488,516],{"class":137},[24,2490,519],{"class":45},[24,2492,522],{"class":141},[24,2494,145],{"class":96},[24,2496,91],{"class":45},[24,2498,308],{"class":96},[24,2500,2502,2504,2506],{"class":26,"data-line":2501,"line":2501},42,[24,2503,207],{"class":37},[24,2505,238],{"class":137},[24,2507,443],{"class":45},[24,2509,2511],{"class":26,"data-line":2510,"line":2510},43,[24,2512,106],{"class":30},[24,2514,2516],{"class":26,"data-line":2515,"line":2515},44,[24,2517,1657],{"emptyLinePlaceholder":1656},[24,2519,2521],{"class":26,"data-line":2520,"line":2520},45,[24,2522,1064],{"class":131},[24,2524,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562],{"class":26,"data-line":2525,"line":2525},46,[24,2527,138],{"class":137},[24,2529,1071],{"class":141},[24,2531,145],{"class":30},[24,2533,149],{"class":148},[24,2535,152],{"class":141},[24,2537,155],{"class":45},[24,2539,158],{"class":141},[24,2541,161],{"class":45},[24,2543,164],{"class":148},[24,2545,167],{"class":137},[24,2547,170],{"class":141},[24,2549,155],{"class":45},[24,2551,175],{"class":141},[24,2553,161],{"class":45},[24,2555,1098],{"class":148},[24,2557,1101],{"class":137},[24,2559,192],{"class":30},[24,2561,195],{"class":45},[24,2563,31],{"class":30},[24,2565,2567,2569,2571,2573,2575,2577,2579],{"class":26,"data-line":2566,"line":2566},47,[24,2568,207],{"class":37},[24,2570,796],{"class":45},[24,2572,265],{"class":137},[24,2574,1119],{"class":141},[24,2576,145],{"class":96},[24,2578,804],{"class":141},[24,2580,308],{"class":96},[24,2582,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602,2604],{"class":26,"data-line":2583,"line":2583},48,[24,2585,207],{"class":37},[24,2587,212],{"class":137},[24,2589,1141],{"class":45},[24,2591,265],{"class":137},[24,2593,1146],{"class":45},[24,2595,1149],{"class":141},[24,2597,145],{"class":96},[24,2599,1098],{"class":45},[24,2601,192],{"class":96},[24,2603,278],{"class":45},[24,2605,31],{"class":96},[24,2607,2609,2611,2613,2615,2617,2619,2621],{"class":26,"data-line":2608,"line":2608},49,[24,2610,207],{"class":37},[24,2612,207],{"class":37},[24,2614,796],{"class":45},[24,2616,516],{"class":137},[24,2618,801],{"class":137},[24,2620,804],{"class":141},[24,2622,31],{"class":305},[24,2624,2626,2628,2630,2632,2634,2636],{"class":26,"data-line":2625,"line":2625},50,[24,2627,207],{"class":37},[24,2629,207],{"class":37},[24,2631,207],{"class":37},[24,2633,815],{"class":45},[24,2635,1188],{"class":49},[24,2637,53],{"class":45},[24,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661,2663],{"class":26,"data-line":2640,"line":2640},51,[24,2642,207],{"class":37},[24,2644,207],{"class":37},[24,2646,207],{"class":37},[24,2648,1201],{"class":45},[24,2650,1204],{"class":141},[24,2652,145],{"class":30},[24,2654,1209],{"class":45},[24,2656,1212],{"class":141},[24,2658,145],{"class":96},[24,2660,192],{"class":96},[24,2662,192],{"class":30},[24,2664,53],{"class":45},[24,2666,2668,2670,2672,2674,2676,2678,2680,2682],{"class":26,"data-line":2667,"line":2667},52,[24,2669,207],{"class":37},[24,2671,207],{"class":37},[24,2673,207],{"class":37},[24,2675,1231],{"class":45},[24,2677,1234],{"class":141},[24,2679,145],{"class":30},[24,2681,192],{"class":30},[24,2683,53],{"class":45},[24,2685,2687,2689,2691,2693,2695,2697],{"class":26,"data-line":2686,"line":2686},53,[24,2688,207],{"class":37},[24,2690,207],{"class":37},[24,2692,207],{"class":37},[24,2694,1251],{"class":45},[24,2696,1254],{"class":49},[24,2698,53],{"class":45},[24,2700,2702,2704,2706,2708],{"class":26,"data-line":2701,"line":2701},54,[24,2703,207],{"class":37},[24,2705,207],{"class":37},[24,2707,19],{"class":45},[24,2709,106],{"class":305},[24,2711,2713,2715,2717,2719,2721,2723,2725],{"class":26,"data-line":2712,"line":2712},55,[24,2714,207],{"class":37},[24,2716,19],{"class":45},[24,2718,189],{"class":96},[24,2720,195],{"class":45},[24,2722,1279],{"class":137},[24,2724,195],{"class":45},[24,2726,31],{"class":96},[24,2728,2730,2732,2734,2736,2738,2740,2742],{"class":26,"data-line":2729,"line":2729},56,[24,2731,207],{"class":37},[24,2733,207],{"class":37},[24,2735,796],{"class":45},[24,2737,516],{"class":137},[24,2739,801],{"class":137},[24,2741,804],{"class":141},[24,2743,31],{"class":305},[24,2745,2747,2749,2751,2753,2755,2757],{"class":26,"data-line":2746,"line":2746},57,[24,2748,207],{"class":37},[24,2750,207],{"class":37},[24,2752,207],{"class":37},[24,2754,815],{"class":45},[24,2756,1188],{"class":49},[24,2758,53],{"class":45},[24,2760,2762,2764,2766,2768],{"class":26,"data-line":2761,"line":2761},58,[24,2763,207],{"class":37},[24,2765,207],{"class":37},[24,2767,207],{"class":37},[24,2769,1324],{"class":45},[24,2771,2773,2775,2777,2779,2781,2783,2785,2787],{"class":26,"data-line":2772,"line":2772},59,[24,2774,207],{"class":37},[24,2776,207],{"class":37},[24,2778,207],{"class":37},[24,2780,1335],{"class":45},[24,2782,1338],{"class":141},[24,2784,145],{"class":30},[24,2786,192],{"class":30},[24,2788,53],{"class":45},[24,2790,2792,2794,2796,2798,2800,2802],{"class":26,"data-line":2791,"line":2791},60,[24,2793,207],{"class":37},[24,2795,207],{"class":37},[24,2797,207],{"class":37},[24,2799,1251],{"class":45},[24,2801,1254],{"class":49},[24,2803,53],{"class":45},[24,2805,2807,2809,2811,2813],{"class":26,"data-line":2806,"line":2806},61,[24,2808,207],{"class":37},[24,2810,207],{"class":37},[24,2812,19],{"class":45},[24,2814,106],{"class":305},[24,2816,2818,2820,2822],{"class":26,"data-line":2817,"line":2817},62,[24,2819,207],{"class":37},[24,2821,19],{"class":45},[24,2823,106],{"class":96},[24,2825,2827,2829,2831,2833,2835,2837,2839,2841,2843],{"class":26,"data-line":2826,"line":2826},63,[24,2828,207],{"class":37},[24,2830,367],{"class":45},[24,2832,265],{"class":137},[24,2834,778],{"class":45},[24,2836,781],{"class":141},[24,2838,145],{"class":96},[24,2840,377],{"class":45},[24,2842,380],{"class":80},[24,2844,308],{"class":96},[24,2846,2848,2850,2852,2854,2856,2858,2860,2862],{"class":26,"data-line":2847,"line":2847},64,[24,2849,207],{"class":37},[24,2851,1403],{"class":45},[24,2853,265],{"class":137},[24,2855,397],{"class":45},[24,2857,400],{"class":141},[24,2859,145],{"class":96},[24,2861,879],{"class":45},[24,2863,308],{"class":96},[24,2865,2867,2869,2871,2873,2875,2877,2879],{"class":26,"data-line":2866,"line":2866},65,[24,2868,207],{"class":37},[24,2870,212],{"class":137},[24,2872,418],{"class":45},[24,2874,421],{"class":137},[24,2876,221],{"class":49},[24,2878,195],{"class":45},[24,2880,31],{"class":96},[24,2882,2884,2886,2888,2890,2892,2894,2896],{"class":26,"data-line":2883,"line":2883},66,[24,2885,207],{"class":37},[24,2887,207],{"class":37},[24,2889,464],{"class":45},[24,2891,1442],{"class":141},[24,2893,145],{"class":305},[24,2895,1447],{"class":45},[24,2897,308],{"class":305},[24,2899,2901,2903,2905],{"class":26,"data-line":2900,"line":2900},67,[24,2902,207],{"class":37},[24,2904,207],{"class":37},[24,2906,1458],{"class":137},[24,2908,2910,2912,2914],{"class":26,"data-line":2909,"line":2909},68,[24,2911,207],{"class":37},[24,2913,19],{"class":45},[24,2915,106],{"class":96},[24,2917,2919,2921,2923,2925,2927,2929,2931,2933,2935,2937,2939,2941,2943,2945,2947,2949,2951],{"class":26,"data-line":2918,"line":2918},69,[24,2920,207],{"class":37},[24,2922,464],{"class":45},[24,2924,467],{"class":141},[24,2926,145],{"class":96},[24,2928,192],{"class":96},[24,2930,155],{"class":45},[24,2932,476],{"class":141},[24,2934,145],{"class":96},[24,2936,481],{"class":80},[24,2938,161],{"class":45},[24,2940,940],{"class":80},[24,2942,943],{"class":137},[24,2944,492],{"class":45},[24,2946,495],{"class":141},[24,2948,145],{"class":305},[24,2950,192],{"class":305},[24,2952,308],{"class":96},[24,2954,2956,2958,2960,2962,2964,2966,2968,2970],{"class":26,"data-line":2955,"line":2955},70,[24,2957,207],{"class":37},[24,2959,464],{"class":45},[24,2961,1442],{"class":141},[24,2963,145],{"class":96},[24,2965,1517],{"class":45},[24,2967,192],{"class":96},[24,2969,195],{"class":45},[24,2971,1524],{"class":131},[24,2973,2975,2977,2979,2981,2983,2985,2987,2989],{"class":26,"data-line":2974,"line":2974},71,[24,2976,207],{"class":37},[24,2978,1532],{"class":45},[24,2980,516],{"class":137},[24,2982,519],{"class":45},[24,2984,522],{"class":141},[24,2986,145],{"class":96},[24,2988,1543],{"class":45},[24,2990,308],{"class":96},[24,2992,2994],{"class":26,"data-line":2993,"line":2993},72,[24,2995,106],{"class":30},[24,2997,2999,3001,3003,3005],{"class":26,"data-line":2998,"line":2998},73,[24,3000,1961],{"class":45},[24,3002,1964],{"class":137},[24,3004,322],{"class":45},[24,3006,1970],{"class":137},[24,3008,3010,3012],{"class":26,"data-line":3009,"line":3009},74,[24,3011,1975],{"class":137},[24,3013,1978],{"class":141},[24,3015,3017],{"class":26,"data-line":3016,"line":3016},75,[24,3018,1657],{"emptyLinePlaceholder":1656},[24,3020,3022,3024,3026],{"class":26,"data-line":3021,"line":3021},76,[24,3023,1681],{"class":137},[24,3025,195],{"class":45},[24,3027,1991],{"class":30},[24,3029,3031,3033,3036,3038,3041],{"class":26,"data-line":3030,"line":3030},77,[24,3032,207],{"class":37},[24,3034,3035],{"class":45},"v1 ",[24,3037,1998],{"class":80},[24,3039,3040],{"class":141},"shortvid-backend\u002Fapi\u002Fshortvid-service\u002Fv1",[24,3042,2004],{"class":80},[24,3044,3046,3048,3050,3053],{"class":26,"data-line":3045,"line":3045},78,[24,3047,207],{"class":37},[24,3049,1998],{"class":80},[24,3051,3052],{"class":141},"shortvid-backend\u002Fapp\u002Fshortvid-service\u002Finternal\u002Fconf",[24,3054,2004],{"class":80},[24,3056,3058,3060,3062,3065],{"class":26,"data-line":3057,"line":3057},79,[24,3059,207],{"class":37},[24,3061,1998],{"class":80},[24,3063,3064],{"class":141},"shortvid-backend\u002Fapp\u002Fshortvid-service\u002Finternal\u002Fservice",[24,3066,2004],{"class":80},[24,3068,3070],{"class":26,"data-line":3069,"line":3069},80,[24,3071,1657],{"emptyLinePlaceholder":1656},[24,3073,3075,3077,3079,3082],{"class":26,"data-line":3074,"line":3074},81,[24,3076,207],{"class":37},[24,3078,1998],{"class":80},[24,3080,3081],{"class":141},"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Flog",[24,3083,2004],{"class":80},[24,3085,3087,3089,3091,3094],{"class":26,"data-line":3086,"line":3086},82,[24,3088,207],{"class":37},[24,3090,1998],{"class":80},[24,3092,3093],{"class":141},"github.com\u002Fgo-kratos\u002Fkratos\u002Fv2\u002Fmiddleware\u002Frecovery",[24,3095,2004],{"class":80},[24,3097,3099,3101,3103,3105],{"class":26,"data-line":3098,"line":3098},83,[24,3100,207],{"class":37},[24,3102,1998],{"class":80},[24,3104,2020],{"class":141},[24,3106,2004],{"class":80},[24,3108,3110],{"class":26,"data-line":3109,"line":3109},84,[24,3111,308],{"class":30},[24,3113,3115],{"class":26,"data-line":3114,"line":3114},85,[24,3116,1657],{"emptyLinePlaceholder":1656},[24,3118,3120],{"class":26,"data-line":3119,"line":3119},86,[24,3121,3122],{"class":131},"\u002F\u002F NewHTTPServer new an HTTP server.\n",[24,3124,3126,3128,3131,3133,3136,3138,3141,3143,3146,3148,3151,3153,3156,3158,3161,3163,3166,3169,3171,3174,3176,3178,3181,3183,3185,3187,3189],{"class":26,"data-line":3125,"line":3125},87,[24,3127,138],{"class":137},[24,3129,3130],{"class":141}," NewHTTPServer",[24,3132,145],{"class":30},[24,3134,3135],{"class":148},"c",[24,3137,167],{"class":137},[24,3139,3140],{"class":141},"conf",[24,3142,155],{"class":45},[24,3144,3145],{"class":141},"Server",[24,3147,161],{"class":45},[24,3149,3150],{"class":148},"users",[24,3152,167],{"class":137},[24,3154,3155],{"class":141},"service",[24,3157,155],{"class":45},[24,3159,3160],{"class":141},"UsersService",[24,3162,161],{"class":45},[24,3164,3165],{"class":148},"logger",[24,3167,3168],{"class":141}," log",[24,3170,155],{"class":45},[24,3172,3173],{"class":141},"Logger",[24,3175,192],{"class":30},[24,3177,195],{"class":45},[24,3179,3180],{"class":137},"*",[24,3182,170],{"class":141},[24,3184,155],{"class":45},[24,3186,3145],{"class":141},[24,3188,195],{"class":45},[24,3190,31],{"class":30},[24,3192,3194,3196,3199,3202,3204,3206,3208,3210,3212,3214,3217],{"class":26,"data-line":3193,"line":3193},88,[24,3195,207],{"class":37},[24,3197,3198],{"class":137},"var",[24,3200,3201],{"class":45}," opts ",[24,3203,516],{"class":137},[24,3205,195],{"class":45},[24,3207,97],{"class":96},[24,3209,1776],{"class":96},[24,3211,170],{"class":141},[24,3213,155],{"class":45},[24,3215,3216],{"class":141},"ServerOption",[24,3218,31],{"class":96},[24,3220,3222,3224,3226,3228,3231],{"class":26,"data-line":3221,"line":3221},89,[24,3223,207],{"class":37},[24,3225,207],{"class":37},[24,3227,322],{"class":45},[24,3229,3230],{"class":141},"Middleware",[24,3232,1991],{"class":305},[24,3234,3236,3238,3240,3242,3245,3248,3250,3252],{"class":26,"data-line":3235,"line":3235},90,[24,3237,207],{"class":37},[24,3239,207],{"class":37},[24,3241,207],{"class":37},[24,3243,3244],{"class":45},"recovery.",[24,3246,3247],{"class":141},"Recovery",[24,3249,145],{"class":30},[24,3251,192],{"class":30},[24,3253,53],{"class":45},[24,3255,3257,3259,3261,3263,3265],{"class":26,"data-line":3256,"line":3256},91,[24,3258,207],{"class":37},[24,3260,207],{"class":37},[24,3262,19],{"class":45},[24,3264,192],{"class":305},[24,3266,53],{"class":45},[24,3268,3270,3272,3274],{"class":26,"data-line":3269,"line":3269},92,[24,3271,207],{"class":37},[24,3273,19],{"class":45},[24,3275,106],{"class":96},[24,3277,3279,3281,3283,3286,3288,3291,3293],{"class":26,"data-line":3278,"line":3278},93,[24,3280,207],{"class":37},[24,3282,212],{"class":137},[24,3284,3285],{"class":45}," c.Http.Network ",[24,3287,421],{"class":137},[24,3289,3290],{"class":80}," \"\"",[24,3292,195],{"class":45},[24,3294,31],{"class":96},[24,3296,3298,3300,3302,3304,3306,3308,3310,3312,3315,3317,3320,3322],{"class":26,"data-line":3297,"line":3297},94,[24,3299,207],{"class":37},[24,3301,207],{"class":37},[24,3303,1008],{"class":45},[24,3305,516],{"class":137},[24,3307,1013],{"class":141},[24,3309,145],{"class":305},[24,3311,1018],{"class":45},[24,3313,3314],{"class":141},"Network",[24,3316,145],{"class":30},[24,3318,3319],{"class":45},"c.Http.Network",[24,3321,192],{"class":30},[24,3323,308],{"class":305},[24,3325,3327,3329,3331],{"class":26,"data-line":3326,"line":3326},95,[24,3328,207],{"class":37},[24,3330,19],{"class":45},[24,3332,106],{"class":96},[24,3334,3336,3338,3340,3343,3345,3347,3349],{"class":26,"data-line":3335,"line":3335},96,[24,3337,207],{"class":37},[24,3339,212],{"class":137},[24,3341,3342],{"class":45}," c.Http.Addr ",[24,3344,421],{"class":137},[24,3346,3290],{"class":80},[24,3348,195],{"class":45},[24,3350,31],{"class":96},[24,3352,3354,3356,3358,3360,3362,3364,3366,3368,3371,3373,3376,3378],{"class":26,"data-line":3353,"line":3353},97,[24,3355,207],{"class":37},[24,3357,207],{"class":37},[24,3359,1008],{"class":45},[24,3361,516],{"class":137},[24,3363,1013],{"class":141},[24,3365,145],{"class":305},[24,3367,1018],{"class":45},[24,3369,3370],{"class":141},"Address",[24,3372,145],{"class":30},[24,3374,3375],{"class":45},"c.Http.Addr",[24,3377,192],{"class":30},[24,3379,308],{"class":305},[24,3381,3383,3385,3387],{"class":26,"data-line":3382,"line":3382},98,[24,3384,207],{"class":37},[24,3386,19],{"class":45},[24,3388,106],{"class":96},[24,3390,3392,3394,3396,3399,3401,3403,3405],{"class":26,"data-line":3391,"line":3391},99,[24,3393,207],{"class":37},[24,3395,212],{"class":137},[24,3397,3398],{"class":45}," c.Http.Timeout ",[24,3400,421],{"class":137},[24,3402,221],{"class":49},[24,3404,195],{"class":45},[24,3406,31],{"class":96},[24,3408,3410,3412,3414,3416,3418,3420,3422,3424,3427,3429,3432,3435,3437,3439,3441],{"class":26,"data-line":3409,"line":3409},100,[24,3411,207],{"class":37},[24,3413,207],{"class":37},[24,3415,1008],{"class":45},[24,3417,516],{"class":137},[24,3419,1013],{"class":141},[24,3421,145],{"class":305},[24,3423,1018],{"class":45},[24,3425,3426],{"class":141},"Timeout",[24,3428,145],{"class":30},[24,3430,3431],{"class":45},"c.Http.Timeout.",[24,3433,3434],{"class":141},"AsDuration",[24,3436,145],{"class":96},[24,3438,192],{"class":96},[24,3440,192],{"class":30},[24,3442,308],{"class":305},[24,3444,3446,3448,3450],{"class":26,"data-line":3445,"line":3445},101,[24,3447,207],{"class":37},[24,3449,19],{"class":45},[24,3451,106],{"class":96},[24,3453,3455],{"class":26,"data-line":3454,"line":3454},102,[24,3456,1657],{"emptyLinePlaceholder":1656},[24,3458,3460,3462],{"class":26,"data-line":3459,"line":3459},103,[24,3461,207],{"class":37},[24,3463,605],{"class":131},[24,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485,3487],{"class":26,"data-line":3466,"line":3466},104,[24,3468,207],{"class":37},[24,3470,1008],{"class":45},[24,3472,516],{"class":137},[24,3474,1013],{"class":141},[24,3476,145],{"class":96},[24,3478,1018],{"class":45},[24,3480,595],{"class":141},[24,3482,145],{"class":305},[24,3484,595],{"class":45},[24,3486,192],{"class":305},[24,3488,308],{"class":96},[24,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510,3512],{"class":26,"data-line":3491,"line":3491},105,[24,3493,207],{"class":37},[24,3495,1008],{"class":45},[24,3497,516],{"class":137},[24,3499,1013],{"class":141},[24,3501,145],{"class":96},[24,3503,1018],{"class":45},[24,3505,1579],{"class":141},[24,3507,145],{"class":305},[24,3509,1579],{"class":45},[24,3511,192],{"class":305},[24,3513,308],{"class":96},[24,3515,3517],{"class":26,"data-line":3516,"line":3516},106,[24,3518,1657],{"emptyLinePlaceholder":1656},[24,3520,3522,3524,3526,3528,3530,3532,3534,3536,3538],{"class":26,"data-line":3521,"line":3521},107,[24,3523,207],{"class":37},[24,3525,1033],{"class":45},[24,3527,265],{"class":137},[24,3529,1038],{"class":45},[24,3531,1041],{"class":141},[24,3533,145],{"class":96},[24,3535,1046],{"class":45},[24,3537,1049],{"class":137},[24,3539,308],{"class":96},[24,3541,3543,3545,3548,3551,3553,3556],{"class":26,"data-line":3542,"line":3542},108,[24,3544,207],{"class":37},[24,3546,3547],{"class":45},"v1.",[24,3549,3550],{"class":141},"RegisterUsersServiceHTTPServer",[24,3552,145],{"class":96},[24,3554,3555],{"class":45},"srv, users",[24,3557,308],{"class":96},[24,3559,3561,3563,3565],{"class":26,"data-line":3560,"line":3560},109,[24,3562,207],{"class":37},[24,3564,238],{"class":137},[24,3566,3567],{"class":45}," srv\n",[24,3569,3571],{"class":26,"data-line":3570,"line":3570},110,[24,3572,106],{"class":30},[3574,3575,3576],"style",{},"html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}",{"title":19,"searchDepth":70,"depth":70,"links":3578},[3579,3580,3581],{"id":110,"depth":34,"text":110},{"id":1054,"depth":34,"text":1054},{"id":1593,"depth":34,"text":1593},[3583],"微服务","2026-04-12","介绍如何在 Kratos 中自定义 HTTP 成功响应与错误响应，并结合 Proto 错误码统一接口格式。",false,"md",null,{"slots":3590},{},"\u002F2026\u002F04\u002Fkratos-resp-proxy",{"text":3593,"minutes":3594,"time":3595,"words":3596},"5 min read",4.525,271500,905,{"title":5,"description":3585},{"loc":3591},"posts\u002F2026\u002F04\u002Fkratos-resp-proxy",[3601,3602],"Kratos","Protobuf","tech","oNc52o65aB9UaYgykswYy50_BvstIavPIq21jMTsM1c",[3606,3610],{"title":3607,"path":3608,"stem":3609,"date":3584,"type":3603,"children":-1},"Kratos HTTP 请求与路由配置","\u002F2026\u002F04\u002Fkratos-request","posts\u002F2026\u002F04\u002Fkratos-request",{"title":3611,"path":3612,"stem":3613,"date":3584,"type":3603,"children":-1},"Kratos 服务注册与发现实践","\u002F2026\u002F04\u002Fkratos-svc-discover","posts\u002F2026\u002F04\u002Fkratos-svc-discover",1786555054161]