Daniel T. Daniel T. - 5 months ago 9
JSON Question

How do I upload a file with metadata using a REST web service?

I have a REST web service that currently exposes this URL:

http://server/data/media

where users can

POST
the following JSON:

{
"Name": "Test",
"Latitude": 12.59817,
"Longitude": 52.12873
}


in order to create a new Media metadata.

Now I need the ability to upload a file at the same time as the media metadata. What's the best way of going about this? I could introduce a new property called
file
and base64 encode the file, but I was wondering if there was a better way.

There's also using
multipart/form-data
like what a HTML form would send over, but I'm using a REST web service and I want to stick to using JSON if at all possible.

Answer

I agree with Greg that a two phase approach is a reasonable solution, however I would do it the other way around. I would do:

POST http://server/data/media
body:
{
    "Name": "Test",
    "Latitude": 12.59817,
    "Longitude": 52.12873
}

To create the metadata entry and return a response like:

201 Created
Location: http://server/data/media/21323
{
    "Name": "Test",
    "Latitude": 12.59817,
    "Longitude": 52.12873,
    "ContentUrl": "http://server/data/media/21323/content"
}

The client can then use this ContentUrl and do a PUT with the file data.

The nice thing about this approach is when your server starts get weighed down with immense volumes of data, the url that you return can just point to some other server with more space/capacity. Or you could implement some kind of round robin approach if bandwidth is an issue.