问题
I'm trying to execute (in IntelliJ IDE or from sbt command-line) this very basic dispatch snippet from behind a proxy :
import dispatch._
val svc = url("http://api.hostip.info/country.php")
val country = Http(svc > as.String)
println(country())
and all I can get is an exception :
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
I tried with no conclusive result to set the usual vm parameters :
-Dhttp.proxyHost=
_my_proxy_host_ -Dhttp.proxyPort=80
and still got the same exception.
On the other hand, the following snippet does work well :
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())
Since it does not seem quite aesthetic nor scala-ish, I wonder if it is really what I am supposed to do in such a case.
Any help would be welcome, thanks in advance.
回答1:
http.proxyHost
and http.proxyPort
will be used if you set this parameter:
-Dcom.ning.http.client.AsyncHttpClientConfig.useProxyProperties=true
Additionaly there are parameters:
-Dcom.ning.http.client.AsyncHttpClientConfig.proxy.user=user
-Dcom.ning.http.client.AsyncHttpClientConfig.proxy.password=password
-Dcom.ning.http.client.AsyncHttpClientConfig.proxy.protocol=NTLM
回答2:
Looks like my question wasn't very inspiring.
I did a little exercie in the pimp my library style :
package dispatch
package object ext {
import com.ning.http.client.ProxyServer
class DefaultPoxyVerbs(override val subject: Req) extends ProxyVerbs
object NoProxy extends ProxyServer("",0)
object Proxy {
def apply(host: String,port: Int) = new ProxyServer(host,port)
}
trait ProxyVerbs extends RequestVerbs {
def through(proxy : ProxyServer) =
if (NoProxy == proxy) subject else subject.setProxyServer(proxy)
def ||>(proxy : ProxyServer) = through(proxy)
}
implicit def implyProxyVerbs(builder: Req) =
new DefaultPoxyVerbs(builder)
}
Now I can write :
import dispatch._
import dispatch.ext._
val svc = url("http://api.hostip.info/country.php") through Proxy("blah blah blah",80)
val country = Http(svc > as.String)
println(country())
which is a little bit more eye pleasing and coherent regarding dispatch api style.
While it was an interesting exercise, I still don't know by now if i was originally using the api the way I was supposed to nor why setting http.proxyHost
and http.proxyPort
properties didn't work since it seems to work for others.
来源:https://stackoverflow.com/questions/14253515/use-dispatch-0-9-5-behind-proxy