UPDATE
Hi I am currently having getting an error with CORS when trying to connect to Insightlys CRM's API. I am successfully retrieving my Insightly CRM data through POSTMAN.
Insightly does not support CORS for AJAX requests (http://support.insight.ly/hc/en-us/community/posts/206961417-Using-the-API-with-AJAX) and you have to setup an API proxy script. I have used the below supplied proxy script done in python and uploaded to my dedicated hosting. But I am still getting a 401 error?
I am quite new to API proxies so not sure if I am missing something here?
GET https://api.insight.ly/v2.2/Contacts 401 (Unauthorized)
apiproxy.py
#
# Insightly API Proxy for Python / App Engine
# Brian McConnell <brian@insightly.com>
#
# This utility is designed to act as an API proxy server. It is written in Python 2.7
# and will run without modification on Google App Engine. Just serve your JavaScript
# from the /js directory in this project, and AJAX requests should be relayed through
# to the Insightly service. This should also run on any webapp2 compatible server platform
#
import base64
import os
import string
import types
import urllib
import urllib2
import webapp2
import wsgiref.handlers
#
# import google app engine libraries, replace these with standard
#
try:
from google.appengine.ext import webapp
except:
# skip Google App Engine webapp library
pass
base_url = 'https://api.insight.ly/v2.2'
def authenticate():
#
# add user validation logic here, be careful to do this in a way that does not expose user secrets such as
# the user API key (this is why we do not allow CORS in the first place)
#
# hardcoding API key for now
apikey = 'fillinhere'
return base64.encode(apikey)
def generateRequest(url, method, data, alt_auth=None, test=False, headers=None):
"""
This method is used by other helper functions to generate HTTPS requests and parse server responses. This will minimize the amount of work developers need to do to integrate with the Insightly API, and will also eliminate common sources of errors such as authentication issues and malformed requests. Uses the urllib2 standard library, so it is not dependent on third party libraries like Requests
"""
if type(url) is not str: raise Exception('url must be a string')
if type(method) is not str: raise Exception('method must be a string')
valid_method = False
response = None
text = ''
if method == 'GET' or method == 'PUT' or method == 'DELETE' or method == 'POST':
valid_method = True
else:
raise Exception('parameter method must be GET|DELETE|PUT|UPDATE')
request = urllib2.Request(url)
request.get_method = lambda: method
request.add_header('Content-Type', 'application/json')
if headers is not None:
headerkeys = headers.keys()
for h in headerkeys:
request.add_header(h, headers[h])
# open the URL, if an error code is returned it should raise an exception
if method == 'PUT' or method == 'POST':
result = urllib2.urlopen(request, data)
else:
result = urllib2.urlopen(request)
text = result.read()
return text
class APIProxyHandler(webapp2.RequestHandler):
def delete(self):
apikey = authenticate()
path_qs = self.request.headers['path_qs']
url = base_url + path_qs
headers = {'Authorization','Basic ' + api_key}
text = generateRequest(url, 'DELETE', None, headers=headers)
self.response.headers['Content-Type']='application/json'
self.response.out.write(text)
def get(self):
apikey = authenticate()
path_qs = self.request.headers['path_qs']
url = base_url + path_qs
headers = {'Authorization','Basic ' + api_key}
text = generateRequest(url, 'GET', None, headers=headers)
self.response.headers['Content-Type']='application/json'
self.response.out.write(text)
def post(self):
body = self.request.headers['body']
path_qs = self.request.headers['path_qs']
url = base_url + path_qs
headers = {'Authorization','Basic ' + api_key}
text = generateRequest(url, 'POST', body, headers=headers)
self.response.headers['Content-Type']='application/json'
self.response.out.write(text)
def put(self):
body = self.request.headers['body']
path_qs = self.request.headers['path_qs']
url = base_url + path_qs
headers = {'Authorization','Basic ' + api_key}
text = generateRequest(url, 'PUT', body, headers=headers)
self.response.headers['Content-Type']='application/json'
self.response.out.write(text)
app = webapp2.WSGIApplication([("r/(.*)", APIProxyHandler)], debug=True)
# map generic page server request handler
jQuery/Ajax call:
Insightly = function () {
var _t = this;
this.events = function () {
$(".contactsform").submit(_t.searchContacts);
};
this.searchContacts = function (event) {
event.preventDefault();
var $search = $(this);
console.log('[ Search contacts event ]');
$.ajaxPrefilter( function( options ) {
if ( options.crossDomain ) {
var newData = {};
newData.data = $.extend({}, options.data);
newData.url = options.url;
options = {};
// Set the proxy URL
options.url = "http://www.blahblah.comm/apiproxy.py";
console.log("ajaxprefilter");
options.data = $.param(newData);
console.log(options);
options.crossDomain = false;
}
});
// How to use the cross domain proxy
$.ajax({
url: 'https://api.insight.ly/v2.2/Contacts',
crossDomain: true,
processData: false
}).success(function(data) {
var jsonData = JSON.parse(data);
console.log(jsonData);
});
};//End SearchContacts
this.init = function () {
_t.events();
};
this.init();
return (this);
};//End main function
var LZ = new Insightly();
Your help is greatly appreciated.