Expose request-building logic publicly (Part 2)

Following on from #39, I didn't want to mangle the history of the branch from the previous PR.

This branch contains the minimal set of changes, as discussed.