Scala http 操作
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5564074/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Scala http operations
提问by Omry Yadan
How do I perform the following in Scala:
我如何在 Scala 中执行以下操作:
- HTTP Get
- HTTP Get With custom headers
- HTTP Post
- HTTP 获取
- 带有自定义标头的 HTTP Get
- HTTP 邮递
回答by thoredge
You could try out Dispatch. A little difficult to grasp at first, but after a while I've started to like it. It works on top of HttpClient.
你可以试试Dispatch。一开始有点难以理解,但过了一段时间我开始喜欢它。它在 HttpClient 之上工作。
import dispatch.Http
import Http._
// Get
Http(url("http://youruri.com/yo") >>> System.out)
// Get with header
Http(url("http://youruri.com/yo") <:< Map("Accept" -> "application/json") >>> System.out)
// Post
Http(url("http://youruri.com/yo") << yourPostData >|)
回答by gruenewa
You can simply use java.net.URL to send HTTP GET and HTTP POST requests. You can also set HTTP request headers on the HttpURLConnection like this:
您可以简单地使用 java.net.URL 发送 HTTP GET 和 HTTP POST 请求。您还可以在 HttpURLConnection 上设置 HTTP 请求标头,如下所示:
val con = url.openConnection.asInstanceOf[HttpURLConnection]
con.setRequestProperty("Header", "Value")
I have written myself a utility class which does exactly this. You can see it here:
我已经为自己编写了一个实用程序类,它正是这样做的。你可以在这里看到它:
回答by Antonin Brettsnajdr
this is my own implementation of a simple Http client including cookies management. Maybe it will be useful for you. But I'm not sure if header modification is directly possible (it may require your own implementation of URLConnection).
这是我自己实现的一个简单的 Http 客户端,包括 cookie 管理。也许它对你有用。但我不确定是否可以直接修改标头(它可能需要您自己实现 URLConnection)。
import java.io.OutputStreamWriter
import java.net.{URLConnection, URL}
class Http(userAgent: String,
encoding: String,
HttpRequestTimeout: Int = 15000) {
import collection.JavaConversions._
import Implicits.wrapInputStream
import java.net.URLEncoder.encode
var cookies = Map[String, String]()
private def loadCookies(conn: URLConnection) {
for ((name, value) <- cookies) conn.setRequestProperty("Cookie", name + "=" + value)
}
private def saveCookies(conn: URLConnection) {
conn.getHeaderFields.lift("Set-Cookie") match {
case Some(cList) => cList foreach { c =>
val (name,value) = c span { _ != '=' }
cookies += name -> (value drop 1)
}
case None =>
}
}
private def encodePostData(data: Map[String, String]) =
(for ((name, value) <- data) yield encode(name, encoding) + "=" + encode(value, encoding)).mkString("&")
def Get(url: String) = {
val u = new URL(url)
val conn = u.openConnection()
conn.setRequestProperty("User-Agent", userAgent)
conn.setConnectTimeout(HttpRequestTimeout)
loadCookies(conn)
conn.connect
saveCookies(conn)
conn.getInputStream.mkString
}
def Post(url: String, data: Map[String, String]) = {
val u = new URL(url)
val conn = u.openConnection
conn.setRequestProperty("User-Agent", userAgent)
conn.setConnectTimeout(HttpRequestTimeout)
loadCookies(conn)
conn.setDoOutput(true)
conn.connect
val wr = new OutputStreamWriter(conn.getOutputStream())
wr.write(encodePostData(data))
wr.flush
wr.close
saveCookies(conn)
conn.getInputStream.mkString
}
}
回答by djhworld
While I appreciate the Dispatch library for all it's worth, the syntax still confuses me a bit.
虽然我很欣赏 Dispatch 库的所有价值,但语法仍然让我有点困惑。
Someone directed me to scalaj-http the other daywhich seems a little easier
前几天有人指导我使用scalaj-http,这似乎更容易一些
回答by DenisD
Regarding simply GETting data from URL. If you don't want to use external sources, then:
关于简单地从 URL 获取数据。如果您不想使用外部资源,则:
val in = scala.io.Source.fromURL("http://some.your.url/params?start&here",
"utf-8")
for (line <- in.getLines)
println(line)
For all other stuff, you can choose any method you like from answers above.
对于所有其他内容,您可以从上面的答案中选择您喜欢的任何方法。
回答by Hanxue
Based on @Antonin Brettsnajdr's answer, a simply version of uploading a file using POST
基于@Antonin Brettsnajdr 的回答,使用 POST 上传文件的简单版本
val conn = new URL("http://myserver.appspot.com/upload").openConnection()
conn.setDoOutput(true)
conn.connect
val input = new FileInputStream(file)
val buffer = new Array[Byte](2 * 1024 * 1024)
Stream.continually(input.read(buffer)).takeWhile(_ != 1).foreach(conn.getOutputStream.write(_))
回答by schmmd
You could use spray-client. The documentation is lacking (it took me some digging to find out how to make GET requests with query parameters) but it's a great option if you are already using spray. We're using it at AI2over dispatchbecause the operators are less symbolic and we're already using spray/actors.
您可以使用spray-client。缺少文档(我花了一些时间才找到如何使用查询参数发出 GET 请求),但如果您已经在使用喷雾,这是一个不错的选择。我们在AI2over dispatch 中使用它,因为操作符不太具有象征意义,而且我们已经在使用喷雾/演员。
import spray.client.pipelining._
val url = "http://youruri.com/yo"
val pipeline: HttpRequest => Future[HttpResponse] = addHeader("X-My-Special-Header", "fancy-value") ~ sendReceive
// Get with header
pipeline(Get(url)) map (_.entity.asString) onSuccess { case msg => println(msg) }
// Get with header and parameters
pipeline(Get(Uri(url) withParams ("param" -> paramValue)) map (_.entity.asString) onSuccess { case msg => println(msg) }
// Post with header
pipeline(Post(url, yourPostData)) map (_.entity.asString) onSuccess { case msg => println(msg) }
回答by Abimbola Esuruoso
I've used Dispatch, Spray Client and the Play WS Client Library...None of them were simply to use or configure. So I created a simpler HTTP Client library which lets you perform all the classic HTTP requests in simple one-liners.
我使用过 Dispatch、Spray Client 和 Play WS Client Library……它们都不是简单的使用或配置。所以我创建了一个更简单的 HTTP 客户端库,它可以让你在简单的单行中执行所有经典的 HTTP 请求。
See an example:
看一个例子:
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)
}
... produces ...
... 产生 ...
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-GB">...</html>
The library is called Cirrus and is available via Maven Central
该库称为 Cirrus,可通过 Maven Central 获得
libraryDependencies += "com.github.godis" % "cirrus_2.11" % "1.4.1"
The documentation is available on GitHub
该文档可在 GitHub 上找到
https://github.com/Godis/Cirrus

