Scala http操作

Omr*_*dan 20 scala http

如何在Scala中执行以下操作:

  • HTTP Get
  • HTTP Get使用自定义标头
  • HTTP Post

tho*_*dge 21

你可以试试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 >|)
Run Code Online (Sandbox Code Playgroud)

  • Dispatch的唯一问题是你几乎找不到一个有意义名字的方法.操作员方法无处不在.您的代码可能很容易看起来像摩尔斯电码. (27认同)
  • 如果您对操作员感到困难,可能需要查看概述页面:http://www.flotsam.nl/dispatch-periodic-table.html (5认同)
  • 看起来像一个漂亮的API (4认同)
  • 表情!有人会真的很困惑. (3认同)
  • 我在github(https://github.com/thoraage/coffee-trader)上有一个项目,我在那里尝试了Dispatch和RestHelpers of Lift的边界.它提供了一些例子; 否则无法在谷歌搜索(因为它看起来像莫尔斯电码). (2认同)
  • OMG,这个API带来了最糟糕的scala.Api是无用的,除非你一直在你面前有一张备忘单. (2认同)

gru*_*ewa 18

您只需使用java.net.URL发送HTTP GET和HTTP POST请求即可.您还可以在HttpURLConnection上设置HTTP请求标头,如下所示:

val con = url.openConnection.asInstanceOf[HttpURLConnection]
con.setRequestProperty("Header", "Value")
Run Code Online (Sandbox Code Playgroud)

我写了一个实用程序类,它正是这样做的.你可以在这里看到它:

https://github.com/gruenewa/gruenewa-misc/blob/master/gruenewa-wsclient/src/main/scala/gruenewa/wsclient/Service.scala


Ant*_*jdr 11

这是我自己实现的一个简单的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
  }
}
Run Code Online (Sandbox Code Playgroud)


djh*_*rld 8

虽然我很欣赏Dispatch库的所有价值,但语法仍然让我感到困惑.

一天,有人指示我scalaj-http,这似乎有点容易