Belajar Ruby - Networking & HTTP
Series/Belajar Ruby/Episode 13
Episode 13 of 23

Belajar Ruby - Networking & HTTP

Episode ini membedah komunikasi jaringan Ruby: TCPSocket dan Socket.tcp dengan Happy Eyeballs v2 RFC 8305, UDPSocket, dasar socket server, serta HTTP client dengan Net::HTTP, URI, dan gem modern httparty dan faraday untuk panggilan REST API.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Backend service jarang bekerja sendiri. Ia memanggil API lain, berkomunikasi dengan cache, atau menerima koneksi dari client. Semua itu berakar pada satu kemampuan dasar: networking. Ruby menyediakan lapisan socket yang matang serta HTTP client di stdlib dan ekosistem gem.

Episode 13 ini membedah dua lapisan. Lapisan pertama adalah socket: TCPSocket dan Socket.tcp dengan Happy Eyeballs v2 (RFC 8305) yang menjadi default sejak Ruby 3.4, UDPSocket, dan socket server sederhana. Lapisan kedua adalah HTTP client: Net::HTTP dan URI bawaan, ditambah gem modern seperti httparty dan faraday untuk panggilan REST API.

Socket TCP

TCPSocket dan Socket.tcp

Socket TCP adalah pondasi hampir semua protokol aplikasi — HTTP, database, cache. TCPSocket.new(host, port) membuka koneksi dan mengembalikan stream yang bisa ditulis dan dibaca:

RubyTCPSocket dasar
require "socket"
socket = TCPSocket.new("ruby-lang.org", 80)
socket.write "HEAD / HTTP/1.0\r\n\r\n"
puts socket.gets
socket.close

TCPSocket.new("ruby-lang.org", 80) membuka koneksi ke port 80, socket.write mengirim request HTTP minimal, dan socket.gets membaca satu baris respons. Operasi seperti ini adalah inti dari setiap HTTP client — semua gem HTTP hanyalah pembungkus di atas mekanisme yang sama.

Happy Eyeballs v2 (RFC 8305)

Host modern sering punya banyak alamat IP — IPv4 dan IPv6. Sejak Ruby 3.4, Socket.tcp secara default menerapkan Happy Eyeballs v2 (RFC 8305): mencoba beberapa alamat secara paralel dan memakai yang pertama merespons. Ini menghilangkan penundaan yang terjadi saat satu keluarga alamat lambat:

RubySocket.tcp dengan Happy Eyeballs
require "socket"
Socket.tcp("ruby-lang.org", 443) do |s|
  puts "terhubung ke #{s.remote_address.ip_address}"
end

Block Socket.tcp("ruby-lang.org", 443) do |s| membuka koneksi TLS-port sekaligus memastikan socket ditutup otomatis setelah block selesai. Pemilihan alamat terbaik ditangani di balik layar sesuai RFC 8305, jadi kalian tidak perlu menulis logika failover sendiri.

UDP dan Socket Server

UDPSocket

Tidak seperti TCP, UDP adalah protokol tanpa koneksi — data dikirim sebagai datagram tanpa jaminan sampai dan tanpa handshake. Cocok untuk log telemetry, DNS, atau probing yang toleran kehilangan paket:

RubyUDPSocket
require "socket"
socket = UDPSocket.new
socket.send("ping", 0, "localhost", 1234)
socket.close

UDPSocket.new membuat socket UDP, dan socket.send("ping", 0, "localhost", 1234) mengirim datagram ke alamat tujuan tanpa membangun koneksi. Karena tidak ada koneksi, UDP sangat ringan — tetapi kalian harus siap kehilangan paket di aplikasi yang memakainya.

Basic Socket Server

Di sisi penerima, TCPServer mendengarkan koneksi masuk dan accept mengambil setiap client:

RubySocket server dasar
require "socket"
server = TCPServer.new(3000)
loop do
  client = server.accept
  client.puts "Halo dari server Ruby"
  client.close
end

TCPServer.new(3000) mendengarkan port 3000, dan server.accept memblokir sampai ada client terhubung. Server di atas menjawab setiap koneksi dengan satu baris — fondasi minimal sebelum kita mengenal web server sungguhan di episode 14.

HTTP Client

Net::HTTP dan URI

Untuk panggilan HTTP, stdlib menyediakan Net::HTTP dan URI. Kombinasi keduanya cukup untuk request sederhana tanpa dependency tambahan:

Panggilan REST API dengan Net::HTTP
ruby -r net/http -r uri -e 'uri = URI("https://api.github.com/users/octocat"); puts Net::HTTP.get(uri)[0, 60]'

Command di atas memuat net/http dan uri, membangun objek URI, lalu mengambil body respons. Net::HTTP.get(uri) mengembalikan body sebagai string — output berupa JSON yang terpotong 60 karakter. Untuk kontrol penuh (headers, status, error), gunakan Net::HTTP.start dengan block.

HTTP Client Modern: httparty dan faraday

Untuk production, gem modern jauh lebih nyaman. httparty menawarkan API satu baris, sedangkan faraday memberikan middleware dan adapter yang bisa ditukar:

RubyHTTP client dengan httparty
require "httparty"
respons = HTTParty.get("https://api.github.com/users/octocat")
puts respons.code
puts respons["login"]

HTTParty.get(...) mengembalikan objek respons dengan method code (status HTTP) dan akses hash ke body JSON yang sudah di-parse. respons["login"] langsung mengambil field JSON. Gemfaraday memberikan hal serupa dengan fleksibilitas middleware untuk logging, retry, dan otentikasi — pilihan favorit di tim besar.

Timeout dan Retry dengan Faraday

Request HTTP tanpa batas waktu adalah bom waktu di production — satu service yang lambat bisa menahan seluruh thread. Faraday memakai adapter faraday-http modern dan memungkinkan timeout serta retry dikonfigurasi secara eksplisit:

RubyFaraday dengan timeout dan retry
require "faraday"
 
client = Faraday.new(url: "https://api.github.com") do |builder|
  builder.request :retry, max: 3, interval: 0.5
  builder.options.timeout = 5
  builder.options.open_timeout = 2
end
 
respons = client.get("/users/octocat")
puts respons.status

builder.request :retry, max: 3 mencoba ulang hingga tiga kali dengan jeda setengah detik, builder.options.timeout = 5 membatasi total waktu request, dan open_timeout = 2 membatasi waktu membuka koneksi. Kebijakan retry yang realistis selalu disertai open_timeout dan timeout — tanpa keduanya, retry bisa memperparah beban service yang sedang lambat.

Info

Pilih Net::HTTP untuk dependency ringan, httparty untuk kecepatan pengembangan, dan faraday saat kalian butuh middleware dan kebijakan retry yang terstruktur. Untuk arsitektur microservice yang ketat, faraday dengan retry dan timeouts hampir selalu jawabannya.

Penutup

Episode 13 membekali kalian dengan komunikasi jaringan: TCPSocket dan Socket.tcp dengan Happy Eyeballs v2, UDPSocket, dasar socket server, serta HTTP client dari Net::HTTP sampai httparty dan faraday.

Inti yang harus dibawa pulang:

  • TCPSocket dan Socket.tcp adalah pondasi komunikasi TCP di Ruby.
  • Socket.tcp memakai Happy Eyeballs v2 (RFC 8305) secara default sejak Ruby 3.4.
  • UDP tidak punya koneksi dan toleran kehilangan paket; cocok untuk telemetry ringan.
  • TCPServer dan accept adalah dasar membangun socket server.
  • Net::HTTP dan URI cukup untuk request sederhana tanpa dependency.
  • httparty sederhana; faraday fleksibel dengan middleware dan retry.
  • respons.code dan akses hash JSON adalah pola umum membaca hasil API.

Di episode 14 selanjutnya kita akan membahas web frameworks dan membangun API — konsep interface Rack, web server Puma yang thread-based, middleware, framework Sinatra untuk API cepat, gambaran Rails 8.x full-stack, serta membangun REST API dengan routing, JSON response, params, dan error handling. Ini titik di mana Ruby mulai menjadi aplikasi nyata.

Belajar Ruby - Networking & HTTP | Belajar Ruby