npm's top HTTP client, request, packaged for Meteor
Meteor's http package is great, but it doesn't support retrieving binary data (useful, for example, when downlading an image). There are no plans to add this feature since the http package should behave the same on the client as on the server.
var result = request.getSync("https://meteor.com/meteor-logo.png", {
encoding: null
});
var buffer = result.body;This Buffer can be stored in the database or written to a file.
- Install
meteor add froatsnook:request - Don't forget to import if using meteor 1.3 or later
import { request } from "meteor/froatsnook:request";var res0 = request.sync(uri, options); // sync version of calling request directly
var res1 = request.putSync(uri, options); // sync version of calling request.put
var res2 = request.patchSync(uri, options); // sync version of calling request.patch
var res3 = request.postSync(uri, options); // sync version of calling request.post
var res4 = request.headSync(uri, options); // sync version of calling request.head
var res5 = request.delSync(uri, options); // sync version of calling request.del
var res6 = request.getSync(uri, options); // sync version of calling request.getCallbacks passed to request are called with 3 parameters. The error, the response, and the body. The response and body are returned as an object: { response, body }. And error is thrown (see below).
// request.js
request("http://www.google.com", function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Show the HTML for the Google homepage.
}
})
// meteor-request
try {
var res = request.sync("http://google.com");
if (res.response.statusCode == 200) {
console.log(res.body);
}
} catch (error) {
// See below for info on errors
}Normal errors generate non-2XX status codes.
var res = request.getSync(urlThatDoesNotExist);
console.assert(res.response.statusCode === 404);Other errors (mostly from http.ClientRequest) are thrown. This happens when request gives an error in its first callback parameter.
try {
var res = request.getSync(urlThatHangs, {
timeout: 1000
});
} catch (err) {
console.assert(err.code === "ETIMEDOUT");
}The uri and options are both optional, but either uri or options.uri (or alias options.url) should be set as a fully qualified uri or a parsed URL object from url.parse. The options are passed on to request. See here for supported options.
request.defaults returns a wrapper around the normal request API that defaults to whatever options you pass to it. As of meteor-request 2.53.1, the returned wrapper includes getSync and friends.
var requestWithToken = request.defaults({
headers: { "X-TOKEN": "d0d0309d-69cb-4435-bd43-8f3ac9266039" }
});
// Both of these requests send the X-TOKEN header.
var res1 = requestWithToken.getSync(url1);
var res2 = requestWithToken.getSync(url2);var buffer = new Buffer([0, 1]);
var res = request.postSync("http://example.com/echoPostBody", {
body: buffer,
encoding: null
});
console.assert(res.body instanceof Buffer);
console.assert(res.body.length === 2);
console.assert(res.body[0] === 0);
console.assert(res.body[1] === 1);I added tests, removed the native dependency on fibers (by using Meteor.wrapAsync), updated to the latest request, and added new features like request.defaults support.
This project doesn't use semver since it tracks request's version numbers. Sorry for the inconvenience.
MIT