UNPKG

ninjs-request

Version:
171 lines (143 loc) 5.48 kB
'use strict' const _ = require('ninjs-lodash') const request = require('../') const fs = require('fs-extra') const http = require('http') const _NAME = _.path.name(__filename) const _NS = `ninjs.request.test.${_NAME}` const _URL = 'https://google.com' module.exports = { NAME: _NAME, NS: _NS, DIR: __dirname, FILE: __filename, run: run, get: get } function run(options) { toFile() toPut() toPost() getPut() getPost() getPutWithResponseEvent() getPutWithErrorEvent() httpTest() advancedHttpTest() piping() } // You can stream any response to a file stream. function toFile() { request('http://google.com/doodle.png') .pipe(fs.createWriteStream('doodle.png')) } request supports application/x-www-form-urlencoded and multipart/form-data form uploads. For multipart/related refer to the multipart API. application/x-www-form-urlencoded (URL-Encoded Forms) URL-encoded forms are simple. request.post('http://service.com/upload', {form:{key:'value'}}) // or request.post('http://service.com/upload').form({key:'value'}) // or request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ }) multipart/form-data (Multipart Form Uploads) For multipart/form-data we use the form-data library by @felixge. For the most cases, you can pass your upload form data via the formData option. var formData = { // Pass a simple key-value pair my_field: 'my_value', // Pass data via Buffers my_buffer: new Buffer([1, 2, 3]), // Pass data via Streams my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), // Pass multiple values /w an Array attachments: [ fs.createReadStream(__dirname + '/attachment1.jpg'), fs.createReadStream(__dirname + '/attachment2.jpg') ], // Pass optional meta-data with an 'options' object with style: {value: DATA, options: OPTIONS} // Use case: for some types of streams, you'll need to provide "file"-related information manually. // See the `form-data` README for more information about options: https://github.com/form-data/form-data custom_file: { value: fs.createReadStream('/dev/urandom'), options: { filename: 'topsecret.jpg', contentType: 'image/jpg' } } }; request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) { if (err) { return console.error('upload failed:', err); } console.log('Upload successful! Server responded with:', body); }); For advanced cases, you can access the form-data object itself via r.form(). This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling form() will clear the currently set form data for that request.) // NOTE: Advanced use-case, for normal use see 'formData' usage above var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...}) var form = r.form(); form.append('my_field', 'my_value'); form.append('my_buffer', new Buffer([1, 2, 3])); form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'}); See the form-data README for more information & examples. multipart/related Some variations in different HTTP implementations require a newline/CRLF before, after, or both before and after the boundary of a multipart/related request (using the multipart option). This has been observed in the .NET WebAPI version 4.0. You can turn on a boundary preambleCRLF or postamble by passing them as true to your request options. request({ method: 'PUT', preambleCRLF: true, postambleCRLF: true, uri: 'http://service.com/upload', multipart: [ { 'content-type': 'application/json', body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) }, { body: 'I am an attachment' }, { body: fs.createReadStream('image.png') } ], // alternatively pass an object containing additional options multipart: { chunked: false, data: [ { 'content-type': 'application/json', body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) }, { body: 'I am an attachment' } ] } }, function (error, response, body) { if (error) { return console.error('upload failed:', error); } console.log('Upload successful! Server responded with:', body); }) # Multipart ## multipart/form-data ### Flickr Image Upload - https://www.flickr.com/services/api/upload.api.html ```js request.post('https://up.flickr.com/services/upload', { oauth: { consumer_key: '...', consumer_secret: '...', token: '...', token_secret: '...' }, // all meta data should be included here for proper signing qs: { title: 'My cat is awesome', description: 'Sent on ' + new Date(), is_public: 1 }, // again the same meta data + the actual photo formData: { title: 'My cat is awesome', description: 'Sent on ' + new Date(), is_public: 1, photo:fs.createReadStream('cat.png') }, json: true }, function (err, res, body) { // assert.equal(typeof body, 'object') }) ```