Main Blog Dealing With Files in REST API

Dealing With Files in REST API

Dealing With Files in REST API

We often come across scenarios where we need to deal with files as a part of the payload of an HTTP request or as a response. Though it is easy to do it manually in postman or swagger, it is a challenge when it comes to automation. In this article, let's see how to automate such api endpoints by sending files as a part of requests and how to download if a response is also a file.

Attach File to Request

Scalaj-HTTP is a wrapper for an HTTP client in Scala. It provides a method — postMulti to attach files as a part of a request.

Let's say there is an endpoint that takes only a file as a payload. (Note, the file should be a multipart of type.)

MultiPart(filename, filepath, mimetype, byteArrayInputStream)

Define your file as a multipart like above. Wonder what is last argument byteArrayInputStream? you should pass the file as a byte array to the request. For example, if you are going to attach an image (png) it will be like below.

MultiPart("image", "src/image.png", "image/png", getByteArray("src/image.png"))

Now, if you are going to use the post method, the entire request goes like this.

val res = Http(url)
        .postMulti(MultiPart(filename, filepath, mimetype, data))

        .method("POST")
        .asString

That's it, this will do the process of attaching files to your request.

Download the File From the Response

Let's say I am getting a file as a response from an endpoint, and I need to download the file. Follow the below 2 steps to do it.

1. Get the Response Using scalaj-HTTP Client

Let's assume we have a simple GET endpoint that gives an image as a response. By using the following code, you will be getting the response.

val res = Http(url)
    .header("accept", "image/png")
    .method("GET")
    .option(HttpOptions.connTimeout(100000))
    .option(HttpOptions.readTimeout(100000))

Remember, how did we send the image as a byteArray to request? Now, it is a reverse to this.

Get the response as a byteArrayInputStream and write it to a file.


val file = new File("src/image/image.png")
file.createNewFile()

val bis = new ByteArrayInputStream(res.asBytes.body)
IOUtils.copy(bis, new FileOutputStream(file))

That's it. You will be able to see the image in the desired path.

src dzone.com
author Gowthamraj Palani
img helpdeskgeek.com/