Installation
npm install anx-api --save
Usage Example
var AnxApi = require('anx-api');
var anxApi = new AnxApi({
target: 'https://api.appnexus.com'
token: 'SESSION_TOKEN',
rateLimiting: true
});
anxApi.get(<serviceName>).then(function (res) {
...
}).catch(function (err) {
...
})
Links
Constructor
var anxApi = new AnxApi(config);
Parameters
config[object]:
target
- (string) required base api urltoken
- (string) optional session tokenrequest
- (object) optional request objecttimeout
- (integer) optional request timeout in milliseconds (default: 60000) Triggers ConnectionAbortedError
error.userAgent
- (string) optional user agentrateLimiting
- (boolean) optional rate limitingconcurrencyLimit
- (integer) optional max concurrent requestsbeforeRequest
- (function) optional before request opts filter (see beforeRequest)afterRequest
- (function) optional after request response filter (see afterRequest)environment
- (enum:node|browser) optional. node - force axios to run as if in node and not the browser (usefull for testing with jest/jasmine).
Instance Methods
#get
Issues a GET request
anxApi.get('service url')
anxApi.get('service url', opts)
anxApi.get(opts)
Parameters
Response Object
- statusCode - (number) Http response code
- headers - (object) Response headers
- body - (object) Response payload
- req - (object) Request options
- requestTime - (number) Actual on network request time in milliseconds
- totalTime - (number) Total request time including concurrency and rate limiting delays in milliseconds
#getBy (Experimental)
Issues a GET request by field name. Supports one value or an array of values.
anxApi.getBy('name', 'bill', 'service url')
anxApi.getBy('name', 'bill', 'service url', opts)
anxApi.getBy('name', 'bill', opts)
anxApi.getBy('name', ['bob', 'bill', 'ben'], 'service url')
anxApi.getBy('name', ['bob', 'bill', 'ben'], 'service url', opts)
anxApi.getBy('name', ['bob', 'bill', 'ben'], opts)
Parameters
- field name - (string)
- value - (string/number OR array(string/number))
- service uri - (string)
- opts - (object) see Request Options
#getById (Experimental)
Issues a GET request by id. Supports one id or an array of ids.
anxApi.getById(1, 'service url')
anxApi.getById(2, 'service url', opts)
anxApi.getById(3, opts)
anxApi.getById([1, 2, 3], 'service url')
anxApi.getById([1, 2, 3], 'service url', opts)
anxApi.getById([1, 2, 3], opts)
Parameters
- id - (number OR array(number))
- service uri - (string)
- opts - (object) see Request Options
#getAll
Usage and parameters are the same as #get accept it pages through api calls.
Response body is parsed as json.
#post
Issues a POST request with a payload
anxApi.post('service url', <payload>)
anxApi.post('service url', <payload>, opts)
anxApi.post(opts)
Parameters
- service uri - (string)
- payload - (string|object)
- opts - (object) see Request Options
#put
Issues a PUT request with a payload
anxApi.put('service url', <payload>)
anxApi.put('service url', <payload>, opts)
anxApi.put(opts)
Parameters
- service uri - (string)
- payload - (string|object)
- opts - (object) see Request Options
#delete
Issues a DELETE request
anxApi.delete('service url')
anxApi.delete('service url', opts)
anxApi.delete(opts)
Parameters
#login
Authenticates with the API and returns a token. The token will be reused for future requests.
anxApi.login('username', 'password').then(function (token) {
...
})
#switchUser
anxApi.switchUser(userId).then(...)
Request Options
The get, post, put, and delete methods can be called with an opts object. The
opts object has the following request options.
uri
- (string) service uribody
- (object) required payload for .post
and .put
headers
- (object) optional request header overridesstartElement
- (string) optional start indexnumElements
- (integer) optional number of records to returnparams
- (object) optional query string parametersmimeType
- (string) optional mimetypetimeout
- (integer) optional request timeout in milliseconds (defaults to config timeout)encodeParams
- (boolean) optional whether or not params object should be encoded. (default: false)
Examples
anxApi.get({
uri: 'creative',
startElement: 50,
numElements: 25
})
anxApi.get('creative', {
params: {
start_element: 50,
num_elements: 25
}
})
anxApi.get('creative?start_element=50&num_elements=25')
Transforming Request Options and Responses
beforeRequest
Request options can be modified prior to request execution by supplying a
beforeRequest
transform function in the constructor. The function should
either return a new options object or null
which will be ignored.
var anxApi = new AnxApi({
...,
beforeRequest: function (opts) {
var modifiedOpts = _.assign({}, opts, {
})
return modifiedOpts;
}
});
afterRequest
Request responses can be modified prior to being delivered by supplying a
afterRequest
transform function in the constructor. The function should return
either a new response object or null
which will be ignored.
var anxApi = new AnxApi({
...,
afterRequest: function (res) {
var modifiedRes = _.assign({}, res, {
})
return modifiedRes;
}
});
Error Handling
anxApi.get('creative').then(function (res) {
...
}).catch(function (err) {
if (err instanceof NotAuthenticatedError) {
console.log('Your not logged in!');
}
})
Error Object Types
Error
- generic error typeNetworkError
DNSLookupError
- target host could not be looked up [ENOTFOUND]ConnectionAbortedError
- request timeout was reached [ECONNABORTED]ConnectionRefusedError
- [ECONNREFUSED]ConnectionResetError
- [ECONNRESET]ConnectionTimeoutError
- [ETIMEDOUT]SocketTimeoutError
- [ESOCKETTIMEDOUT]
ApiError
- base api error type
NotAuthenticatedError
- token is invalid or expiredNotAuthorizedError
- Unauthorized to make requestRateLimitExceededError
SystemServiceUnavailableError
SystemUnknownError
TargetError
- target was not supplied
Error Object Properties
- id - Api error id
- code - Api error code
- message - Brief error description
- req - Request options used in failed request
- res - Raw failed response
Custom Request and Debugging
The following are two different methods of modifying and or spying on requests
made to the api.
Wrap the internal request function
anxApi._config.request = _.wrap(anxApi._config.request, function (request, opts) {
console.log('DEBUG: ', opts);
return request.call(api, opts);
});
Pass in a custom request object
var request = require('request');
function customRequest(opts) {
return new Promise(function (resolve, reject) {
request(opts, function (err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
}
var anxApi = new AnxApi({
target: process.env.ANX_TARGET,
token: 'SESSION_TOKEN',
request: customRequest
});
Tests
Running unit tests
Run the unit test suite from the project root, make sure you've run npm install
first:
npm test
License
See LICENSE file