Rust Actix-Web

Veli Uysal
Turkiye Rust Community
3 min readMay 23, 2023

Yazılarım genellikle blockchain ve yazılım dilleri hakkında olmaktaydı. Bu yazım ise Rust dilinde HTTP/S ve diğer Web için ihtiyaç duyulan kısımlarda kullanabileceğimiz bir kütüphane olan actix-web kütüphanesi hakkında olacaktır. Temel terimleri anlatarak en sonunda da kütüphane kullanılan bir örnek ile yazımı bitireceğim. Hazırsanız başlayalım ;)

HTTP/S Nedir

1990 yılından beri dünya çapında network üzerinde kullanılan bir iletişim protokolüdür. HTTP “Hyper Text Transfer Protocol” yani “Hiper Metin Transfer Protokolü“ olan bir açılıma sahiptir. HTTP protokolü network üzerinden web sayfalarının görüntülenmesini sağlayan protokoldür. HTTP protokolü istemci ile sunucu(server) arasındaki transfer işlemlerinin nasıl olacağını belirler. Varsayılan port olarak ise 80 numaralı portu kullanır. Bu protokolü başlatabilmek için istemci sunucuya bir istek gönderir. Bu isteği Google Chrome, Brave, Safari veya Mozilla Firefox gibi web browser’lar aracılığıyla başlatabiliriz. Sunucu ise bu isteği alır ve Apache veya IIS gibi websunucu programları aracılığıyla cevap verir.

İstemci bir sunucu içeriğine HTTP kullanarak ulaşmaya çalıştığında sunucu yanıtın durumunu belirten bir kod gönderir. Bazı durumlarda HTTP durum kodu (HTTP Status Code) istemcinin tarayıcısında da gösterilebilir Örn; 200, 301, 302, 404 ve 500 kodları en yaygın olanlardır.

HTTPs ise HTTP Secure yani güvenli hiper metin aktarım iletişim protokolü açılımına sahiptir. Bir bilgisayar ağı üzerinden güvenli iletişim için internet üzerinde yaygın olarak kullanılan bir HTTP uzantısıdır. HTTPS’te, iletişim protokolü Taşıma Katmanı Güvenliği (TLS) veya öncesinde, onun öncülü/selefi olan Güvenli Soket Katmanı (SSL) ile şifrelenir. Bu nedenle protokol sık sık TLS üzerinden HTTP veya SSL üzerinden HTTP olarak da adlandırılır.

HTTP Metotları

HTTP 1.1 versiyonu (RFC 2616) ile tanımlanan ve diğer eklentilerle gelen başlıca HTTP metodlarından bazıları ise şunlardır:

  • GET: Sunucudan veri almak için kullanılır.
  • POST: Sunucuya veri yazdırabilirsiniz. Bu metodla istek parametreleri hem URL içinde hem de mesaj gövdesinde gönderilebilir.
  • PUT: Bu metod ile servis sağlayıcı üzerindeki bir kaynağı güncelleyebilirsiniz.
  • HEAD: GET metoduyla benzer işleve sahiptir ancak geri dönen yanıtta mesaj gövdesi bulunmaz (yani başlıklar ve içerikleri GET metoduyla aynıdır).
  • DELETE: Bu metod ile sunucudaki herhangi bir veriyi silebilirsiniz.
  • CONNECT: Bir proxy sunucu üzerinden başka bir sunucuya bağlanmak ve proxy sunucuyu bir tünel gibi kullanmak için kullanılır.
  • OPTIONS: Bu metod belli bir kaynak için kullanılabilecek HTTP metodlarını sunucudan sorgulamak için kullanılır.
  • TRACE: Teşhis amaçlı kullanılan bir metoddur. Sunucu bu metodla gelen istek mesajının içeriğini aynen yanıt gövdesinde geri göndermelidir.
  • PATCH: Bu metod bir kaynağa istediğiniz küçük çaplı değişimi yapmanızı sağlar.
  • SEARCH: Bir dizinin altındaki kaynakları sorgulamak için kullanılır.

Actix-web

Sitesinde Rust için güçlü, pragmatik ve son derece hızlı bir web frameworkü olarak kendilerini tanıtmaktadırlar. Varsayılan olarak gelen özellikleri ise:

  • Type Safe: İstekten yanıta kadar dizgesel olarak yazılan nesnelerin hangi tipte geleceği net bir şekilde belirlenerek kodlama yapılmaktadır.
  • Feature Rich: Kullanıma hazır birçok özellik sunar. HTTP/2, loglama kaydı vb. bileşenlere sahiptir.
  • Extensible: Herhangi bir Actix uygulamasının kullanabileceği kendi kod parçacıklarınızı kolayca oluşturup paylaşabilmenize olanak sağlar.
  • Blazingly Fast: Actix son derece hızlıdır. Bunun için daha önce yayınlanmış benchmark’a buradan ulaşabilirsiniz.
use actix_web::{get, web, App, HttpServer, Responder};

#[get("/")]
async fn index() -> impl Responder {
"Hello, World!"
}

#[get("/{name}")]
async fn hello(name: web::Path<String>) -> impl Responder {
format!("Hello {}!", &name)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(index).service(hello))
.bind(("127.0.0.1", 8080))?
.run()
.await
}

Yukarıdaki örnekte biz actix-web içerisinde bulunan HTTP Get metodunu yakalamamızı sağlayan metodu ve yanıt olarak göndereceğimiz bilgileri sarmalayan bir Responder objesini kodumuza dahil ediyoruz.

Daha sonra #[get(“”)] ifadesiyle bizim get metotlarımızın hangi yol geldiğinde işlem yapacaklarını belirtiyoruz.

#[actix_web::main] ile de bizim kodumuzun derlenikten sonra çalıştığında ilk olarak hangi metottan işleme başlayacağını belirtiyoruz.

Main metodumuzun içinde bind ile bizim “127.0.0.1” yani localhost adresini çalışacak olan bir HTTP sunucusuna bağlama işlemini yapıyoruz.

Browser’ı açtıktan sonra localhost veya 127.0.0.1/ ile bizim yazdığımız koddaki response olan “Hello, World!” yazısını görebiliriz.

Sosyal medya hesaplarım: Twitter | Linkedin | Github | Youtube

--

--