我需要一个成熟的HTTP客户端库,它是scala惯用的,简洁的用法,简单的语义.我查看了Apache HTTP和Scala Dispatch以及许多新的库,这些库承诺提供惯用的Scala包装.Apache HTTP客户端肯定需要冗长,而Dispatch很容易混淆.
什么是适合Scala使用的HTTP客户端?
假设我在master上重新定义实验分支,文件中存在冲突.当然,两个分支都删除了文件.因此,当我解决冲突时,在我看到和.它非常令人困惑.有什么办法可以理解他们的意思吗?谁是他们,谁是我们?git statusdeleted by usdeleted by them
或者在重新定位时有另一种方法可以知道哪个文件被哪个分支删除了?喜欢打印分支名称?
我想POST到URL,设置查询参数和标题,并在正文中传递原始字符串.然后我想做请求并获取输出字符串,以便我可以将其转换为JSON.我还希望异常处理能够响应不同类型的错误(并处理重定向)
但是Dispatch 0.9的记录很糟糕,打破了API和文档版本,非常古怪,所以我无法想出一个完整的解决方案.我完全陷入困境,因此我要求很多.
这是我能想到的全部,但设置查询参数很奇怪:
val solr = host("localhost", 8983)
val req = solr / "update" / "json"
setQueryParameters( Map( "commit" -> "true"))
setHeader( "Content-type", "application/json")
setBody( a)
Run Code Online (Sandbox Code Playgroud)
但设置查询参数给我一个严重的错误:
<console>:14: error: type mismatch;
found : scala.collection.immutable.Map[java.lang.String,java.lang.String]
required: com.ning.http.client.FluentStringsMap
val req = solr / "update" / "json" setQueryParameters( Map( "commit" -> "true"))
Run Code Online (Sandbox Code Playgroud)
请帮助完全设置请求:HTTPS,重定向,查询参数,标题和POST方法.
还帮助(同步,我希望它这样)执行请求以获取正文(和标题)和分支取决于响应代码(200,301,302,400,500).
我正在使用Scala dispatch HTTP库,版本0.10.1.我向一个返回HTTP 301永久重定向的URL发出请求.例如,http: //wikipedia.com返回301,重定向到http://www.wikipedia.org/.我如何使用dispatch获取重定向的URL?
在教程之后,这就是我所做的.
import dispatch._, Defaults._
val svc = url("http://wikipedia.com")
val r = Http(svc OK as.String)
r()
Run Code Online (Sandbox Code Playgroud)
这会引发"意外响应状态:301"异常.据推测,我需要查询r重定向URL 的值,或者可能指定除OK定义之外的其他参数,但我无法弄清楚如何从文档中做什么.
我正在学习Scala,并试图了解特征是如何工作的(特别是在Dispatch库中).
我有这样的事情:
import dispatch._
import dispatch.liftjson._
object Foo
{
def main(cmd: Array[String])
{
val http = new Http;
val req = :/("example.com") / path ># (list ! obj);
val res = http(req);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,它抱怨>#未在dispatch.Request中注册.在dispatch.liftjson中描述了这个特征,并且我的假设是我应该只需要导入该特征(应该覆盖它)以便注册.
我一直在客户端使用Databinder Dispatch库来创建一个简单的REST-ish API.我知道如何检测我是否收到错误状态的HTTP响应:
Http x (request) {
case (200, _, _, content) => successResult(content())
case (404, _, _, _) => notFoundErrorResult
case (_, _, _, _) => genericErrorResult
}
Run Code Online (Sandbox Code Playgroud)
但是,由于域无效或连接失败,我如何区分错误响应和完全没有响应的错误?有没有办法在仍然使用同步语义的同时实现超时?如果API中有任何相关内容,我就错过了.
当我在Dispatch中提出请求时,我应用Promise并得到:
Left(dispatch.StatusCode: Unexpected response status: 400)
Run Code Online (Sandbox Code Playgroud)
我如何获得响应的实际文本?我正在使用Solr,它仍然会返回有失败的HTTP请求的有价值的JSON.
我正在尝试从代理后面执行(在IntelliJ IDE或sbt命令行中)这个非常基本的调度片段:
import dispatch._
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc > as.String)
println(country())
Run Code Online (Sandbox Code Playgroud)
而我所能得到的只是一个例外:
java.net.ConnectException: Connection timed out: no further information to
http://api.hostip.info/country.php java.util.concurrent.ExecutionException:
java.net.ConnectException: Connection timed out: no further information
to http://api.hostip.info/country.php
Run Code Online (Sandbox Code Playgroud)
我尝试没有确定的结果来设置通常的vm参数:
-Dhttp.proxyHost=_my_proxy_host_ -Dhttp.proxyPort=80
并仍然得到相同的异常.
另一方面,以下代码段运行良好:
import dispatch._
val svc = url("http://api.hostip.info/country.php") setProxyServer(new com.ning.http.client.ProxyServer(myproxyhost,80))
val country = Http(svc > as.String)
println(country())
Run Code Online (Sandbox Code Playgroud)
因为它看起来不太美观,也不像scala-ish,我想知道在这种情况下它是否真的应该是我应该做的.
如果提前感谢,欢迎任何帮助.
我写的功能:
1)发送HTTP GET请求(响应是有效的JSON)
2)解析对json对象的响应
代码段:
val page = url("http://graph.facebook.com/9098498615")
val response = Http(page OK dispatch.as.String)
Await.result(response , 10 seconds)
val myJson= JSON.parseFull(response .toString)
//this isnt helping -> val myJson= JSON.parseRaw(response .toString)
Run Code Online (Sandbox Code Playgroud)
问题是在此之后,myJson为None,而我期望它保留响应中的json数据.
救命 ?