78

ScalaでXMLを返すWebサービスに単純なPOSTリクエストを発行しようとしています。

Dispatchはこのタスクに使用される標準ライブラリのようですが、そのドキュメントが見つかりません。上でリンクしているメインサイトでは、約束とは何か、非同期プログラミングを行う方法について詳しく説明していますが、実際にはAPIについては説明していません。周期表があります-少し怖いように見えます-しかし、それはすでに何をすべきかを知っていて、不可解な構文のリマインダーだけを必要とする人々にのみ役立つようです。

また、ScalazにはHTTPの機能があるようですが、そのドキュメントも見つかりません。

4

9 に答える 9

145

私は以下を使用します:https ://github.com/scalaj/scalaj-http 。

簡単なGETリクエストは次のとおりです。

import scalaj.http.{Http, HttpOptions}

Http("http://example.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"
于 2012-07-30T11:20:23.440 に答える
7

スプレークライアントを使用できます。ドキュメントが不足しています(クエリパラメータを使用して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)
于 2014-10-07T18:43:41.603 に答える
5

ディスパッチを使用しています:http://dispatch.databinder.net/Dispatch.html

彼らは私が本当に好きな完全に新しいAPIを備えた新しいバージョン(0.9.0)をリリースしたばかりです。そしてそれは非同期です。

プロジェクトページの例:

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に役立つ可能性があります

于 2012-07-30T11:33:04.137 に答える
5

私のリクエストの使用-Scalaライブラリ:

// Mill
ivy"com.lihaoyi::requests:0.1.8"
// SBT
"com.lihaoyi" %% "requests" % "0.1.8"

これは簡単です

val r = requests.get("https://api.github.com/users/lihaoyi")

r.statusCode
// 200

r.headers("content-type")
// Buffer("application/json; charset=utf-8")

r.text
// {"login":"lihaoyi","id":934140,"node_id":"MDQ6VXNlcjkzNDE0MA==",...
val r = requests.post("http://httpbin.org/post", data = Map("key" -> "value"))

val r = requests.put("http://httpbin.org/put", data = Map("key" -> "value"))

val r = requests.delete("http://httpbin.org/delete")

val r = requests.head("http://httpbin.org/head")

val r = requests.options("http://httpbin.org/get")
于 2019-05-31T10:18:54.880 に答える
3

もう1つのオプションは、Typesafeのplay-wsです。これは、スタンドアロンライブラリとして分割されたPlayFrameworkWSライブラリです。

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

私は必ずしもこれを最良の選択肢として提供するとは限りませんが、言及する価値があります。

于 2015-01-13T01:32:45.237 に答える
2

恥知らずなプラグを作ることができれば、私はBee-Clientと呼ばれるAPIを持っています。これは、JavaのHttpUrlConnection用のScalaの単なるラッパーです。

于 2012-07-31T07:37:57.893 に答える
1

(統合テストで)1つのエンドポイントをテストするために同じことをしなければなりませんでした。したがって、Scalaで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)
  }
于 2017-02-07T09:22:48.320 に答える
0

Apache HttpComponentsを使用してみませんか?これは、幅広いシナリオをカバーするアプリケーションFAQです。

于 2012-07-30T10:16:18.340 に答える
0

これが私が取り組んでいたクラスです。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"
    }
  }

}

于 2019-03-13T11:45:53.487 に答える