Thư viện máy khách HTTP đơn giản và ngắn gọn cho Scala


76

Tôi cần một thư viện máy khách HTTP trưởng thành có tính thành ngữ để mở rộng, cách sử dụng ngắn gọn, ngữ nghĩa đơn giản. Tôi đã xem Apache HTTP và Scala Dispatch và nhiều thư viện mới hứa hẹn một gói Scala thành ngữ. Ứng dụng khách Apache HTTP chắc chắn yêu cầu chi tiết, trong khi Dispatch dễ gây nhầm lẫn.

Ứng dụng khách HTTP phù hợp để sử dụng Scala là gì?


1
Tôi khuyên bạn nên gắn bó với Dispatch. Chắc chắn, tính hoạt động của nó không phù hợp với sở thích của mọi người (nó không phải của tôi), nhưng nó không thực sự tệ như vẻ bề ngoài lúc đầu và tôi đoán rằng nó sẽ vẫn là lựa chọn phổ biến nhất của Scala trong một thời gian.
Travis Brown

4
Điều này có thể hơi lạc đề, nhưng tôi nghĩ chúng ta nên có một nhánh công văn với các tên phương pháp tiếng Anh đơn giản. Điều này sẽ không khó để làm và duy trì
Kim Stebel

3
@KimStebel Dispatch 0.9.x có thể được sử dụng với các phương pháp tiếng Anh đơn thuần.
Daniel C. Sobral

1
Một câu hỏi tương tự là stackoverflow.com/questions/11719373/…
Rick-777

Câu trả lời:


29

Gần đây tôi đã bắt đầu sử dụng Dispatch , hơi phức tạp (phần giới thiệu chung tuyệt vời, thiếu nghiêm trọng các tài liệu dựa trên kịch bản / ca sử dụng chi tiết). Công văn 0.9.1 là một trình bao bọc Scala xung quanh Ứng dụng khách Async Http của Ning ; để hiểu đầy đủ những gì đang diễn ra yêu cầu giới thiệu bản thân của một người với thư viện đó. Trong thực tế, điều duy nhất tôi thực sự phải xem là RequestBuilder - mọi thứ khác đều nằm trong tầm hiểu biết của tôi về HTTP.

Tôi ủng hộ bản phát hành 0.9 một cách chắc chắn (cho đến nay!) Về việc hoàn thành công việc rất đơn giản .. khi bạn đã vượt qua đường cong học tập ban đầu đó.

"Trình tạo" Http của Dispatch là bất biến và dường như hoạt động tốt trong môi trường phân luồng. Mặc dù tôi không thể tìm thấy bất kỳ thứ gì trong tài liệu để nói rằng nó an toàn theo luồng; đọc chung của nguồn cho thấy rằng nó là.

Hãy lưu ý rằng RequestBuilder có thể thay đổi được, và do đó KHÔNG an toàn cho chuỗi.

Dưới đây là một số liên kết bổ sung mà tôi thấy hữu ích:


2
Lưu ý rằng bảng tuần hoàn các toán tử đề cập đến tiền thân trước đây của Dispatch, và hầu hết trong số đó đã bị cắt khỏi 0.9.x và có thể sẽ không quay trở lại.
Daniel C. Sobral

Cảm ơn vì bạn đã làm sáng tỏ. Có gì chút Tôi đã sử dụng đã làm việc độc đáo: các phím tắt builder url, POST, '<<'
Richard Sitze

Vâng, yêu cầu DSL ở đó - đó là phản hồi đã bị loại bỏ, sang một bên những thứ như as.Stringas.xml.Elem, không phải là ký hiệu.
Daniel C. Sobral

Vui lòng giúp tôi với câu hỏi mới của tôi stackoverflow.com/questions/12342062/…
Jesvin Jose

12
Tại sao rất nhiều người giới thiệu nó? DSL khó hiểu, tài liệu nghèo nàn, ít ví dụ, tôi không thể tạo bản demo làm việc đơn giản nhất với nó.
Freewind

29

Tôi đã so sánh hầu hết các thư viện máy khách HTTP chính có sẵn

Dispatch và một số thư viện khác không được duy trì nữa . Những vấn đề nghiêm trọng duy nhất hiện tại là client phunPlay! WS .

phun-client hơi phức tạp trong cú pháp của nó. play-ws khá dễ sử dụng:

(build.sbt)

libraryDependencies += "com.typesafe.play" %% "play-ws" % "2.4.3"

(cách sử dụng cơ bản)

val wsClient = NingWSClient()
wsClient
  .url("http://wwww.something.com")
  .get()
  .map { wsResponse =>
    // read the response
}

2
Dispatch đã khởi động lại: github.com/dispatch/reboot Vì vậy, nó lại là một ứng cử viên khả thi. Nếu bạn có thể vượt qua các 'tên' hàm khó hiểu, đó là một thư viện rất thú vị.
mvherweg

Chơi WS không phụ thuộc vào Akka?
cdmckay

"spray-client hơi phức tạp" - Cá nhân tôi tìm hiểu cú pháp phức tạp, nhưng nó có thể dẫn đến một số trục trặc IDE. Điều đó nói rằng tôi chỉ từng gặp phải một trục trặc cú pháp với IntelliJ IDEAspray-cankiểm tra thông số kỹ thuật.
Jonathan Neufeld

21

Đến bữa tiệc ở đây hơi muộn, nhưng tôi rất ấn tượng với khách hàng phun .

Nó có một DSL tuyệt vời để xây dựng các yêu cầu, hỗ trợ cả thực thi đồng bộ và không đồng bộ, cũng như một loạt các kiểu sắp xếp (không) (JSON, XML, biểu mẫu). Nó cũng rất hợp với Akka .


4
khách hàng phun không may nói rằng các yêu cầu và phản hồi theo từng đoạn không được hỗ trợ. Vậy làm thế nào bạn có thể tải xuống hoặc tải lên các tệp rất lớn trong một hệ thống có bộ nhớ hạn chế? (tức là android & scala)
George Pligoropoulos

3
spray-clientphụ thuộc vào spray-can, spray-http, spray-httpx, spray-util. Tốt rằng không có sự phụ thuộc bên ngoài bởi tại sao tôi cần toàn bộ ngăn xếp Spray. Ngoài ra, tôi gặp sự cố khi triển khai nó vào vùng chứa OSGi.
Andrii Nemchenko

2
Phun bây giờ phụ thuộc vào Akka.
rightfold

14

Hai sáu năm sau lần đầu tiên trả lời bài đăng này, tôi sẽ có một câu trả lời khác.

Tôi đang sử dụng akka-http , sự hợp tác giữa đội phun và akka. Nó được hỗ trợ bởi Lightbend, được liên kết chặt chẽ với môi trường akka async ... đó là công cụ phù hợp cho công việc này.


1
Đáng buồn thay, hôm nay tài liệu khách hàng Api vẫn là trống doc.akka.io/docs/akka-stream-and-http-experimental/1.0-M2/scala/...
Waldemar Wosiński

đây là tài liệu chính thức của phía khách hàng cho akka-http: doc.akka.io/docs/akka-http/10.0.11/scala/http/client-side/…
Andrew Norman

ứng dụng khách akka-http được cung cấp như một phần của thư viện lõi akka-http. liên kết thử nghiệm được cung cấp bởi @ WaldemarWosiński là một dự án nguyên mẫu ban đầu cho những gì đã trở thành khách hàng chính thức trong akka-http. Do đó, bạn sẽ muốn sử dụng liên kết akka-http chứ không phải liên kết trước đó tới dự án "thử nghiệm" mồ côi.
Andrew Norman

Bài viết này so sánh một vài giải pháp đến từ tháng 11 năm 2015: implicitdef.com/2015/11/19/…
Jesse Chisholm

10

Có một số trải nghiệm không vui với ứng dụng Apache, tôi bắt đầu viết bài của riêng mình. HttpURLConnection tích hợp được nhiều người khẳng định là có lỗi. Nhưng đó không phải là kinh nghiệm của tôi về nó. Trên thực tế, ngược lại là như vậy, máy khách Apache có một mô hình phân luồng hơi có vấn đề. Kể từ Java6 (hoặc 5?), HttpURLConnection đã cung cấp các kết nối HTTP1.1 hiệu quả với các yếu tố cần thiết như giữ nguyên được tích hợp sẵn và nó xử lý việc sử dụng đồng thời mà không gặp rắc rối.

Vì vậy, để bù đắp cho API bất tiện do HttpURLConnection cung cấp, tôi bắt đầu viết một API mới trong Scala, như một dự án mã nguồn mở. Nó chỉ là một trình bao bọc cho HttpURLConnection, nhưng không giống như HttpURLConnection, nó nhằm mục đích dễ sử dụng. Không giống như ứng dụng khách Apache, nó sẽ dễ dàng phù hợp với một dự án hiện có. Không giống như Dispatch, nó phải dễ học.

Nó được gọi là Bee Client

Tôi xin lỗi vì cái phích cắm vô liêm sỉ. :)


Tôi đang cố gắng thêm nó như là sự phụ thuộc của Maven, không may mắn. Có lẽ tôi phải thêm một kho lưu trữ khác trước?
Tên hiển thị

Vì tò mò, bạn đã có thể sử dụng giữ nguyên HttpUrlConnectiontrên cơ sở mỗi kết nối hay thực sự không có cách nào khác ngoài thuộc tính hệ thống toàn cầu?
Nicolas Rinaudo

Đối Configtượng có keepAliveboolean: nó kiểm soát xem các kết nối sẽ được đóng hay giữ nguyên trên cơ sở mỗi kết nối ( bigbeeconsultants.co.uk/docs/bee-client/latest/… ).
Rick-777

Lib này vẫn được duy trì? Liên kết đến nguồn repo bị hỏng và dường như không có bản dựng nào cho bất kỳ phiên bản scala nào sau 2.11.
Martin Gladdish

10

sttp là thư viện Scala HTTP mà tất cả chúng ta đang chờ đợi!

Nó có một DSL thông thạo để tạo và thực hiện các yêu cầu (các mẫu mã từ README của họ):

val request = sttp
  .cookie("session", "*!@#!@!$")
  .body(file) // of type java.io.File
  .put(uri"http://httpbin.org/put")
  .auth.basic("me", "1234")
  .header("Custom-Header", "Custom-Value")
  .response(asByteArray)

Nó hỗ trợ các cuộc gọi đồng bộ, không đồng bộ và truyền trực tuyến thông qua các phần phụ trợ có thể cắm được, bao gồm Akka-HTTP (trước đây là Spray) và AsyncHttpClient (Netty) đáng kính:

implicit val sttpHandler = AsyncHttpClientFutureHandler()
val futureFirstResponse: Future[Response[String]] = request.send()

Nó hỗ trợ scala.concurrent.Future, scalaz.concurrent.Task, monix.eval.Task, và cats.effect.IO- tất cả các Scala lớn IO đơn nguyên thư viện.

Ngoài ra, nó còn có một số thủ thuật bổ sung:

val test = "chrabąszcz majowy" val testUri: Uri = uri"http://httpbin.org/get?bug=$test"

  • Nó hỗ trợ bộ mã hóa / giải mã cho các cơ quan / phản hồi yêu cầu, ví dụ như JSON qua Circe:

import com.softwaremill.sttp.circe._ val response: Either[io.circe.Error, Response] = sttp .post(uri"...") .body(requestPayload) .response(asJson[Response]) .send()

Cuối cùng, nó được duy trì bởi những người đáng tin cậy tại softwaremill và nó có tài liệu tuyệt vời .


5

Ngoài Dispatch ra thì không có gì nhiều. scalaz đã cố gắng xây dựng một ứng dụng khách http chức năng. Nhưng nó đã lỗi thời trong một thời gian không có phiên bản nào của nó tồn tại trong nhánh scalaz7. Ngoài ra, có một trình bao bọc hữu ích của ning async-http-client trong playframework. Ở đó bạn có thể thực hiện các cuộc gọi như:

WS.url("http://example.com/feed").get()
WS.url("http://example.com/item").post("content")

Bạn có thể sử dụng API này làm nguồn cảm hứng nếu bạn không sử dụng trò chơi! trong dự án của bạn và không thích API Dispatch.


4

Xịt nước

Bạn thực sự nên cân nhắc sử dụng Spray . Theo ý kiến ​​của tôi, nó có một chút cú pháp phức tạp, nhưng nó vẫn khá hữu ích nếu bạn muốn xây dựng một ứng dụng khách http hiệu suất cao. Ưu điểm chính của việc sử dụng Spray là nó dựa trên thư viện akka Actor , có khả năng mở rộng cực kỳ lớn và mạnh mẽ. Bạn có thể mở rộng ứng dụng khách http của mình thành một số máy chỉ bằng cách thay đổiconf tệp.

Hơn nữa, cách đây vài tháng, Spray tham gia vào Typesafe, và theo tôi hiểu, nó sẽ trở thành một phần của bản phân phối akka cơ bản. bằng chứng

Play2

Một tùy chọn khác là sử dụng Play2 WS lib ( doc ). Theo như tôi biết thì nó vẫn không được tách ra khỏi bản phân phối Play, nhưng do tính chất cực kỳ đơn giản nên rất đáng để dành thời gian gắn toàn bộ Play framework để có được phần đó. Có một số vấn đề khi cung cấp cấu hình cho nó, vì vậy điều này không tốt cho các trường hợp thả và sử dụng. Tuy nhiên, chúng tôi đã sử dụng nó trong một số dự án không dựa trên Play và mọi thứ đều ổn.



1

Ngạc nhiên là không có ai đề cập đến tài chính ở đây. Nó rất đơn giản để sử dụng:

import com.twitter.finagle.{Http, Service}
import com.twitter.finagle.http
import com.twitter.util.{Await, Future}

object Client extends App {
  val client: Service[http.Request, http.Response] = Http.newService("www.scala-lang.org:80")
  val request = http.Request(http.Method.Get, "/")
  request.host = "www.scala-lang.org"
  val response: Future[http.Response] = client(request)
  Await.result(response.onSuccess { rep: http.Response =>
    println("GET success: " + rep)
  })
}

Xem hướng dẫn bắt đầu nhanh để biết thêm chi tiết: https://twitter.github.io/finagle/guide/Quickstart.html


0

Tôi đã sử dụng Dispatch, Spray Client và Play WS Client Library ... Không ai trong số họ chỉ đơn giản là để sử dụng hoặc cấu hình. Vì vậy, tôi đã tạo một thư viện HTTP Client đơn giản hơn cho phép bạn thực hiện tất cả các yêu cầu HTTP cổ điển trong một lớp lót đơn giản.

Xem một ví dụ:

import cirrus.clients.BasicHTTP.GET

import scala.concurrent.Await
import scala.concurrent.duration._

object MinimalExample extends App {

  val html = Await.result(Cirrus(GET("https://www.google.co.uk")), 3 seconds)

  println(html)
}

... sản xuất ...

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-GB">...</html>

Thư viện được gọi là Cirrus và có sẵn trên Maven Central

libraryDependencies += "com.github.godis" % "cirrus_2.11" % "1.4.1"

Tài liệu có sẵn trên GitHub

https://github.com/Godis/Cirrus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.