Как написать Restful-клиент, используя тот же интерфейс, определенный для сервера - PullRequest
0 голосов
/ 19 марта 2012

Я пишу сервис Restful, используя Scala.

На стороне сервера он имеет интерфейс:

trait ICustomerService {
  @GET
  @Path("/{id}")
  @Produces(Array("application/xml"))
  def getCustomer(@PathParam("id") id: Int): StreamingOutput
}

Сервис работает нормально, и я протестировал его с помощью веб-браузера.

Теперь я хочу написать несколько автоматических тестов для этого интерфейса. Мне нужно написать RESTEasy-клиент с тем же интерфейсом:

class CustomerServiceProxy(url : String) {
  RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
  val proxy = ProxyFactory.create(classOf[ICustomerService], url)

  def getCustomer(id: Int): Customer = {
    val streamingOutput = proxy.getCustomer(id)
    <Problem here>
  }
}

Этот код не будет работать, поскольку потоковый вывод разрешает только запись.

Как мне написать этот тестовый класс, чтобы я мог получить то, что сервер пишет в выходной поток на стороне клиента?

Большое спасибо

1 Ответ

1 голос
/ 08 апреля 2012

StreamingOutput не разрешает запись , он выполняет запись .Все, что вам нужно сделать, это создать собственный OutputStream для захвата:

/**
 * Re-buffers data from a JAXRS StreamingOutput into a new InputStream
 */
def rebuffer(so: StreamingOutput): InputStream = {
  val os = new ByteArrayOutputStream
  so.write(os)
  new ByteArrayInputStream(os.toByteArray())
}


def getCustomer(id: Int): Customer = {
  val streamingOutput = proxy.getCustomer(id)
  val inputStream = rebuffer(streamingOutput)
  inputStream.read() // or pass it to an XML parser or whatever
}

Надеюсь, это поможет!

...