Получение файла по URL-адресу в виде строки в Scala: подробное руководство

В Scala существует несколько методов получения файла по URL-адресу и сохранения его содержимого в виде строки. В этой статье вы познакомитесь с различными подходами, предоставив разговорные объяснения и примеры кода, которые помогут вам понять каждый метод. Давайте погрузимся!

Метод 1: использование java.net.URL
Самый простой способ получить файл по URL-адресу — использовать класс java.net.URLв Scala. Вот пример:

import java.net.URL
import scala.io.Source
def getFileContent(url: String): String = {
  val fileUrl = new URL(url)
  val source = Source.fromURL(fileUrl)
  val content = source.mkString
  source.close()
  content
}

Метод 2: использование HttpClient
Другой вариант — использовать библиотеку HttpClient, которая обеспечивает большую гибкость и контроль над HTTP-запросами. Вот пример:

import java.net.URI
import org.apache.hc.client5.http.classic.methods.HttpGet
import org.apache.hc.client5.http.impl.classic.HttpClients
def getFileContent(url: String): String = {
  val httpclient = HttpClients.createDefault()
  val httpGet = new HttpGet(new URI(url))
  val response = httpclient.execute(httpGet)
  val entity = response.getEntity
  val content = EntityUtils.toString(entity)
  response.close()
  content
}

Метод 3: использование Akka HTTP
Для более сложных сценариев вы можете использовать библиотеку Akka HTTP, которая предоставляет мощный набор инструментов для создания приложений на основе HTTP. Вот пример:

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.stream.ActorMaterializer
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def getFileContent(url: String): Future[String] = {
  implicit val system = ActorSystem()
  implicit val materializer = ActorMaterializer()
  val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = url))
  responseFuture.flatMap { response =>
    response.entity.toStrict(5.seconds).map(_.data.utf8String)
  }
}