做Scala中的HTTP请求(Doing HTTP request in Scala)

2019-06-26 14:55发布

我想发出一个简单的POST请求,其返回斯卡拉一些XML web服务。

看来, 调度是用于这个任务的标准库,但我不能为它找到文档。 主要场地,我在上面链接,解释了在长度什么是承诺,怎么办异步编程,但实际上并没有记录的API。 有一个周期表 -这看起来有点吓人-但它似乎只是谁已经知道该怎么做,只需要对语法晦涩提醒有用的人。

这似乎也Scalaz对HTTP一些设施 ,但我也不能为它找到任何文件。

Answer 1:

我用的是以下情况: https://github.com/scalaj/scalaj-http 。

这里有一个简单的GET请求:

import scalaj.http.Http

Http("http://foo.com/search").param("q", "monkeys").asString

和POST的一个示例:

val result = Http("http://example.com/url").postData("""{"id":"12","json":"data"}""")
  .header("Content-Type", "application/json")
  .header("Charset", "UTF-8")
  .option(HttpOptions.readTimeout(10000)).asString

Scalaj HTTP通过SBT可用:

libraryDependencies += "org.scalaj" % "scalaj-http_2.11" % "2.3.0"


Answer 2:

你可以使用喷雾客户端 。 该文档缺乏(我花了一些挖掘,找出如何使查询参数GET请求 ),但如果你已经使用喷雾是一个很好的选择。 和文档比调度好。

我们使用它在AI2了调度 ,因为运营商不太象征性的,我们已经使用喷雾/演员。

import spray.client.pipelining._

val url = "http://youruri.com/yo"
val pipeline: HttpRequest => Future[HttpResponse] = sendReceive

// Post with header and parameters
val responseFuture1: Future[String] = pipeline(Post(Uri(url) withParams ("param" -> paramValue), yourPostData) map (_.entity.asString)

// Post with header
val responseFuture2: Future[String] = pipeline(Post(url, yourPostData)) map (_.entity.asString)


Answer 3:

我使用的调度: http://dispatch.databinder.net/Dispatch.html

他们刚刚发布了一个新版本(0.9.0)具有完整的新的API,我真的很喜欢。 它是异步。

从项目页面范例:

import dispatch._
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc OK as.String)

for (c <- country)
  println(c)

编辑:这可以帮助你https://github.com/dispatch/reboot/blob/master/core/src/main/scala/requests.scala



Answer 4:

另一种选择是类型安全的游乐-WS,这是游戏框架WS库出来,作为一个独立的lib目录下:

http://blog.devalias.net/post/89810672067/play-framework-seperated-ws-library

我不一定会提供这是最好的选择,但值得一提的。



Answer 5:

为什么不使用的Apache HttpComponents ? 这里的应用常见问题 ,涵盖了广泛的场景。



Answer 6:

如果我可以做一个无耻的插头,我有一个名为API 蜂客户端这简直是对Java的HttpURLConnection的Scala中的一个包装。



Answer 7:

我必须做同样的测试一个终点(在集成测试)。 所以,以下是获取来自斯卡拉GET请求响应的代码。 我利用scala.io.Source从端点和ObjectMapper来读取JSON转换成对象。

private def buildStockMasterUrl(url:String, stockStatus:Option[String]) = {
      stockStatus match  {
        case Some(stockStatus) => s"$url?stockStatus=${stockStatus}"
        case _ => url
    }
  }

    private def fetchBooksMasterData(stockStatus:Option[String]):  util.ArrayList[BooksMasterData] = {
    val url: String = buildBooksMasterUrl("http://localhost:8090/books/rest/catalogue/booksMasterData",stockStatus)
    val booksMasterJson : String = scala.io.Source.fromURL(url).mkString
    val mapper = new ObjectMapper()
    apper.readValue(booksMasterJson,classOf[util.ArrayList[BooksMasterData]])
}

case class BooksMasterData(id:String,description: String,category: String)

这里是我的同样的测试方法

test("validate booksMasterData resource") {
    val booksMasterData = fetchBooksMasterData(Option(null))
    booksMasterData.size should be (740)
  }


Answer 8:

这是一类我工作。 它GET和POST请求。 GET不带参数 - POST与我用它,以开始管道或检查管道的地位的StreamSets通信参数。

它只需在build.sbt文件中的以下依赖性:

libraryDependencies += "org.scalaj" %% "scalaj-http" % "2.3.0"

你可以在这里找到的文档: https://github.com/scalaj/scalaj-http#post-raw-arraybyte-or-string-data-and-get-response-code


import scala.collection.mutable.ArrayBuffer
import scalaj.http.{Http, HttpResponse}

object HttpRequestHandler {

  val userName: String = "admin"
  val password: String = "admin"

  def sendHttpGetRequest(request: String): String = {

    println(" Send Http Get Request (Start) ")

    try {

      val httpResponse: HttpResponse[String] = Http(request).auth(userName,password)
                                                            .asString

      val response = if (httpResponse.code == 200) httpResponse.body
      else{
        println("Bad HTTP response: code = "+httpResponse.code )
        return "ERROR"
      }

      println(" Send Http Get Request (End) ")

      return response

    } catch {
      case e: Exception => println("Error in sending Get request: "+e.getMessage)
        return "ERROR"
    }


  }

  def arrayBufferToJson(params:ArrayBuffer[(String,String)]): String ={

    var jsonString = "{"
    var count: Int = 0
    for(param <- params){
      jsonString+="\""+param._1+"\":\""+param._2+"\""+ ( if(count!=params.length-1) "," else "")
      count+=1
    }
    jsonString+="}"

    return jsonString

  }

  def sendHttpPostRequest(request: String,params: ArrayBuffer[(String,String)]): String = {

    println(" Send Http Post Request (Start) ")

    try {
      val postData : String = arrayBufferToJson(params)
      println("Parameters: "+postData)
      val httpResponse: HttpResponse[String] = Http(request).auth(userName,password)
                                                            .header("X-Requested-By","sdc")
                                                            .header("Content-Type", "application/json;charset=UTF-8")
                                                            .header("X-Stream" , "true")
                                                            .header("Accept", "application/json")
                                                            .postData(postData.getBytes)
                                                            .asString


      val response = if (httpResponse.code == 200) httpResponse.body
      else{
        println("Bad HTTP response: code = "+httpResponse.code )
        "ERROR"
      }

      println(" Send Http Post Request (End) ")

      return response

    } catch {
      case e: Exception => println("Error in sending Post request: " + e.getMessage)
        return "ERROR"
    }
  }

}



文章来源: Doing HTTP request in Scala