[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-ep-30-http-requests-responses-js-go-all--*":3,"academy-blog-translations-ky32ob9p43od5mm":85},{"data":4,"page":84,"perPage":84,"totalItems":84,"totalPages":84},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":78,"keywords":79,"locale":54,"published_at":80,"scheduled_at":13,"school_blog":76,"short_description":81,"slug":82,"status":74,"title":6,"updated":83,"updated_by":13,"views":77},"JS2GO EP.30 การทำงานกับ HTTP Requests และ Responses: JavaScript (Fetch\u002FExpress) vs Go (net\u002Fhttp)","sclblg987654321","school_blog_translations","\u003Cp>HTTP เป็นโปรโตคอลสำคัญสำหรับการสื่อสารระหว่าง client และ server ไม่ว่าจะเป็นการสร้าง API หรือเว็บแอปพลิเคชัน ในบทความนี้เราจะเปรียบเทียบการจัดการ \u003Cstrong>HTTP Requests และ Responses\u003C\u002Fstrong> ใน JavaScript (Node.js + Fetch\u002FExpress) และ Go (net\u002Fhttp) พร้อมตัวอย่างโค้ดและแนวทางปฏิบัติที่เหมาะสมสำหรับระบบ production\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>1. การทำ HTTP Requests ใน JavaScript\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>\u003Cstrong>Client-side: Fetch API\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">\u002F\u002F GET request\nfetch('https:\u002F\u002Fjsonplaceholder.typicode.com\u002Fposts\u002F1')\n  .then(response =&gt; response.json())\n  .then(data =&gt; console.log(data))\n  .catch(err =&gt; console.error('Error:', err));\n\n\u002F\u002F POST request\nfetch('https:\u002F\u002Fjsonplaceholder.typicode.com\u002Fposts', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({ title: 'Hello', body: 'World' })\n})\n  .then(response =&gt; response.json())\n  .then(data =&gt; console.log(data))\n  .catch(err =&gt; console.error('Error:', err));\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>ข้อดีของ Fetch:\u003C\u002Fstrong>\u003Cbr>✔️ Syntax กระชับ ใช้งานร่วมกับ async\u002Fawait ได้ง่าย\u003Cbr>✔️ รองรับ JSON, headers และ HTTP methods หลายแบบ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>\u003Cstrong>Server-side: Express\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-javascript\">const express = require('express');\nconst app = express();\napp.use(express.json());\n\napp.get('\u002Fapi\u002Fposts\u002F:id', (req, res) =&gt; {\n  res.json({ id: req.params.id, title: 'Hello', body: 'World' });\n});\n\napp.post('\u002Fapi\u002Fposts', (req, res) =&gt; {\n  const { title, body } = req.body;\n  res.status(201).json({ id: 1, title, body });\n});\n\napp.listen(3000, () =&gt; console.log('Server running on port 3000'));\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>ข้อดีของ Express:\u003C\u002Fstrong>\u003Cbr>✔️ Routing และ middleware ใช้งานง่าย\u003Cbr>✔️ รองรับ JSON parsing, authentication และ logging\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>2. การทำ HTTP Requests ใน Go\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>\u003Cstrong>Client-side: HTTP GET \u002F POST\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"bytes\"\n    \"encoding\u002Fjson\"\n    \"fmt\"\n    \"io\u002Fioutil\"\n    \"net\u002Fhttp\"\n)\n\nfunc main() {\n    \u002F\u002F GET request\n    resp, err := http.Get(\"https:\u002F\u002Fjsonplaceholder.typicode.com\u002Fposts\u002F1\")\n    if err != nil {\n        fmt.Println(\"Error:\", err)\n        return\n    }\n    defer resp.Body.Close()\n    body, _ := ioutil.ReadAll(resp.Body)\n    fmt.Println(string(body))\n\n    \u002F\u002F POST request\n    data := map[string]string{\"title\": \"Hello\", \"body\": \"World\"}\n    jsonData, _ := json.Marshal(data)\n    resp, err = http.Post(\"https:\u002F\u002Fjsonplaceholder.typicode.com\u002Fposts\", \"application\u002Fjson\", bytes.NewBuffer(jsonData))\n    if err != nil {\n        fmt.Println(\"Error:\", err)\n        return\n    }\n    defer resp.Body.Close()\n    body, _ = ioutil.ReadAll(resp.Body)\n    fmt.Println(string(body))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>\u003Cstrong>Server-side: net\u002Fhttp\u003C\u002Fstrong>\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"encoding\u002Fjson\"\n    \"fmt\"\n    \"net\u002Fhttp\"\n)\n\ntype Post struct {\n    ID    int    `json:\"id\"`\n    Title string `json:\"title\"`\n    Body  string `json:\"body\"`\n}\n\nfunc getPostHandler(w http.ResponseWriter, r *http.Request) {\n    post := Post{ID: 1, Title: \"Hello\", Body: \"World\"}\n    w.Header().Set(\"Content-Type\", \"application\u002Fjson\")\n    json.NewEncoder(w).Encode(post)\n}\n\nfunc postPostHandler(w http.ResponseWriter, r *http.Request) {\n    var post Post\n    json.NewDecoder(r.Body).Decode(&amp;post)\n    post.ID = 1\n    w.Header().Set(\"Content-Type\", \"application\u002Fjson\")\n    w.WriteHeader(http.StatusCreated)\n    json.NewEncoder(w).Encode(post)\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fapi\u002Fposts\", postPostHandler)\n    http.HandleFunc(\"\u002Fapi\u002Fposts\u002F1\", getPostHandler)\n    fmt.Println(\"Server running on port 3000\")\n    http.ListenAndServe(\":3000\", nil)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>ข้อดีของ Go:\u003C\u002Fstrong>\u003Cbr>✔️ Type-safe และตรวจสอบค่า compile-time\u003Cbr>✔️ Efficient และ lightweight\u003Cbr>✔️ มี built-in JSON support และ HTTP server\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>3. แนวทางปฏิบัติที่เหมาะสม\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>✔️ ใช้ JSON เป็น standard data format\u003Cbr>✔️ ตรวจสอบ error และ HTTP response status code\u003Cbr>✔️ จัดการ headers ให้เหมาะสม (Content-Type, Authorization)\u003Cbr>✔️ ใช้ async\u002Fawait (JS) หรือ Goroutines (Go) สำหรับ concurrent requests\u003Cbr>✔️ แยก client และ server logic ให้ชัดเจน\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>4. เปรียบเทียบ JavaScript vs Go HTTP\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cfigure class=\"table\">\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Feature\u003C\u002Fth>\u003Cth>JavaScript (Fetch\u002FExpress)\u003C\u002Fth>\u003Cth>Go (net\u002Fhttp)\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>Client\u003C\u002Ftd>\u003Ctd>fetch \u002F axios\u003C\u002Ftd>\u003Ctd>http.Get \u002F http.Post\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Server\u003C\u002Ftd>\u003Ctd>Express\u003C\u002Ftd>\u003Ctd>net\u002Fhttp\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>JSON\u003C\u002Ftd>\u003Ctd>Auto parsing \u002F stringify\u003C\u002Ftd>\u003Ctd>json.Marshal \u002F json.Unmarshal\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Concurrency\u003C\u002Ftd>\u003Ctd>async\u002Fawait \u002F Promises\u003C\u002Ftd>\u003Ctd>Goroutines\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Type Safety\u003C\u002Ftd>\u003Ctd>Dynamic\u003C\u002Ftd>\u003Ctd>Static\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>Middleware\u003C\u002Ftd>\u003Ctd>Express supports middleware\u003C\u002Ftd>\u003Ctd>net\u002Fhttp handlers, optional middleware\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>คำแนะนำ:\u003C\u002Fstrong>\u003Cbr>✔️ Frontend &amp; lightweight APIs → ใช้ JavaScript Fetch + Express\u003Cbr>✔️ High-performance backend \u002F type-safe APIs → ใช้ Go net\u002Fhttp\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ตอนต่อไป\u003C\u002Fh2>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>ใน EP.31 ของซีรีส์ JS2GO เราจะพาคุณไปเรียนรู้ \u003Cstrong>Queues และ Stacks ใน JavaScript กับ Go\u003C\u002Fstrong> เพื่อเข้าใจการจัดการข้อมูลแบบ linear structures และใช้งานได้อย่างมีประสิทธิภาพในโปรเจกต์จริง\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>อ่านบทความ Series อื่นๆ\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FGolang\">\u003Cstrong>Golang The Series\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FJS2GO\">\u003Cstrong>JS2GO\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003Cli>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdev.school\u002Fblogs\u002Fcategories\u002FTailwind%20CSS\">\u003Cstrong>10 Ep ที่จะให้คุณเป็นมือโปร Tailwind CSS ในชั่วข้ามคืน\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🔴 YouTube : \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUC2eI2RxcA2zbTqZyHyWIfRg\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevschool\u002F\">\u003Cstrong>Superdev Academy\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\u002F\u002Fwww.superdevacademy.com\u002F\">\u003Cstrong>https:\u002F\u002Fwww.superdevacademy.com\u002F\u003C\u002Fstrong>\u003C\u002Fa>\u003C\u002Fp>","59_11zon_gs77mptgxb.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F4liaejin7eyh6qw\u002F59_11zon_gs77mptgxb.webp","2026-03-04 08:45:57.625Z","",{"keywords":15,"locale":48,"school_blog":58},[16,23,28,33,38,43],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:45:56.277Z","xkqgbkpjasz92aq","HTTP Requests","2026-04-10 16:13:06.020Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:45:56.615Z","vtm5nz2999gdgmg","HTTP Responses","2026-04-10 16:13:06.150Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:45:56.977Z","weydtw2f14gy8zx","JavaScript Fetch","2026-04-10 16:13:06.266Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:45:57.170Z","3jqr1ahs06wfl7p","Go net\u002Fhttp","2026-04-10 16:13:06.358Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:20:42.484Z","vslzz9nvv6n77cx","JavaScript","2026-04-10 16:07:28.339Z",{"code":49,"collectionId":50,"collectionName":51,"created":52,"flag":53,"id":54,"is_default":55,"label":56,"updated":57},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":59,"collectionId":60,"collectionName":61,"expand":62,"id":76,"views":77},"hsa1afr8fcnd6qb","pbc_2105096300","school_blogs",{"category":63},{"blogIds":64,"collectionId":65,"collectionName":66,"created":67,"created_by":13,"id":59,"image":68,"image_alt":13,"image_path":69,"label":70,"name":71,"priority":72,"publish_at":73,"scheduled_at":13,"status":74,"updated":75,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:24:37.986Z","js2_go_2_11zon_y6paxmuz32.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fhsa1afr8fcnd6qb\u002Fjs2_go_2_11zon_y6paxmuz32.webp",{"en":71,"th":71},"JS2GO",10,"2025-08-11 03:41:08.820Z","published","2026-04-25 02:32:14.339Z","ky32ob9p43od5mm",222,"4liaejin7eyh6qw",[20,25,30,35,40,45],"2025-10-22 02:21:43.361Z","เรียนรู้การจัดการ HTTP Requests และ Responses ใน JavaScript (Fetch\u002FExpress) และ Go (net\u002Fhttp) พร้อมตัวอย่างโค้ดและแนวทางปฏิบัติที่เหมาะสมสำหรับการสร้าง API และเว็บแอปพลิเคชันอย่างมืออาชีพ","ep-30-http-requests-responses-js-go","2026-04-25 02:47:58.689Z",1,{"th":82}]