Scala и HttpClient: как устранить эту ошибку? - PullRequest
3 голосов
/ 22 апреля 2010

Я использую scala с Apache HttpClient и работаю с примерами. Я получаю следующую ошибку:

/Users/name/IdeaProjects/JakartaCapOne/src/JakExamp.scala
   Error:Error:line (16)error: overloaded method value execute with alternatives 
(org.apache.http.HttpHost,org.apache.http.HttpRequest)org.apache.http.HttpResponse 
<and> 
(org.apache.http.client.methods.HttpUriRequest,org.apache.http.protocol.HttpContext)org.apache.http.HttpResponse
 cannot be applied to 
(org.apache.http.client.methods.HttpGet,org.apache.http.client.ResponseHandler[String])
val responseBody = httpclient.execute(httpget, responseHandler)

Вот код с ошибкой и выделенной строкой:

import org.apache.http.client.ResponseHandler
import org.apache.http.client.HttpClient
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.BasicResponseHandler
import org.apache.http.impl.client.DefaultHttpClient


object JakExamp {
 def main(args : Array[String]) : Unit = {
   val httpclient: HttpClient = new DefaultHttpClient
   val httpget: HttpGet = new HttpGet("www.google.com")

   println("executing request..." + httpget.getURI)
   val responseHandler: ResponseHandler[String] = new BasicResponseHandler
   val responseBody = httpclient.execute(httpget, responseHandler)
   // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   println(responseBody)

   client.getConnectionManager.shutdown

 }
}

Я могу успешно запустить пример в Java ...

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Мне тоже приходилось иметь дело с этим. Попробуйте что-то вроде следующего:

val handler:ResponseHandler[String] = new BasicResponseHandler
val request = new HttpGet("...")
val response = client execute request
val body = handler handleResponse response

Это прекрасно работает для меня в 2.7.7. Это только 1 дополнительная строка, так что не так уж и плохо.

1 голос
/ 23 апреля 2010

Для Scala 2.7 сообщалось ( 2016 ), но с небольшим успехом. Может быть, его можно открыть заново, указав случай, который легче воспроизвести.

Вы можете использовать отражение (через структурную типизацию Scala), чтобы обойти это, следующим образом:

import org.apache.http.client._
import org.apache.http.client.methods._
import org.apache.http.impl.client._
val httpclient = new DefaultHttpClient
val httpget = new HttpGet("www.google.com")
val brh = new BasicResponseHandler[String]
//httpclient.execute (httpget, brh)
httpclient.asInstanceOf[{
  def execute (request: HttpUriRequest,
               responseHandler: ResponseHandler[String]): String
}].execute (httpget, brh)

В Scala 2.8 я обнаружил, что работает следующий код:

import org.apache.http.client._
import org.apache.http.client.methods._
import org.apache.http.impl.client._
val httpclient = new DefaultHttpClient
val httpget = new HttpGet("www.google.com")
val brh = new BasicResponseHandler
httpclient.execute (httpget, brh)

Поэтому я думаю, что это исправлено в 2.8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...