Skip to content

Instantly share code, notes, and snippets.

@volkovasystems
Last active August 29, 2015 14:13
Show Gist options
  • Save volkovasystems/2c5635d6a17e59e76fc8 to your computer and use it in GitHub Desktop.
Save volkovasystems/2c5635d6a17e59e76fc8 to your computer and use it in GitHub Desktop.
Basic JSON XMLHttpRequest implementation.
var jsonHttp = function jsonHttp( ){
var xmlHttpEngine = {
"xmlHttp": new XMLHttpRequest( )
};
var requestSet = {
"querySet": { },
"parameterSet": { },
"headerSet": {
"Content-Type": "application/json;charset=UTF-8"
},
"URL": "/",
"method": "HEAD"
};
var include = function include( ){
};
var define = function define( ){
};
var setURL = function setURL( URL ){
requestSet.URL = URL;
return requestEngine;
};
var setMethod = function setMethod( method ){
requestSet.method = method;
return requestEngine;
};
var setHeader = function setHeader( headerSet ){
for( var header in headerSet ){
requestSet.headerSet[ header ] = headerSet[ header ];
}
requestSet.headerSet = Object.freeze( requestSet.headerSet );
return requestEngine;
};
var setQuery = function setQuery( querySet ){
for( var query in querySet ){
requestSet.querySet[ query ] = querySet[ query ];
}
requestSet.querySet = Object.freeze( requestSet.querySet );
return requestEngine;
};
var setParameter = function setParameter( parameterSet ){
for( var parameter in parameterSet ){
requestSet.parameterSet[ parameter ] = parameterSet[ parameter ];
}
requestSet.parameterSet = Object.freeze( requestSet.parameterSet );
return requestEngine;
};
var appendQuery = function appendQuery( URL ){
var querySet = requestSet.querySet;
var queryString = "";
for( var query in requestSet.querySet ){
queryString += [ query, querySet[ query ] ].join( "=" );
}
if( /\?/.test( URL ) &&
/\&/.test( URL ) )
{
URL = [ URL, queryString ].join( "&" );
}else if( /\?/.test( URL ) ){
URL = [ URL, queryString ].join( "" );
}else{
URL = [ URL, queryString ].join( "?" );
}
return URL;
};
var addHeader = function addHeader( xmlHttp, headerSet ){
var xmlHttp = xmlHttpEngine.xmlHttp;
for( var header in headerSet ){
xmlHttp.setRequestHeader( header, headerSet[ header ] );
}
};
var get = function get( URL ){
requestEngine.setURL( URL );
requestEngine.setMethod( "GET" );
return requestEngine;
};
var post = function post( URL ){
requestEngine.setURL( URL );
requestEngine.setMethod( "POST" );
return requestEngine;
};
var send = function send( onResponseCallback ){
var xmlHttp = xmlHttpEngine.xmlHttp;
xmlHttp.onreadystatechange = function onReadyStateChange( ){
if( xmlHttp.readyState == 4 &&
xmlHttp.status == 200 )
{
var result = JSON.parse( xmlHttp.responseText );
onResponseCallback( null, result, xmlHttp );
}else if( xmlHttp.readyState == 4 ){
onResponseCallback( new Error( "request failed" ), null, xmlHttp );
}
};
var URL = appendQuery( requestSet.URL );
xmlHttp.open( requestSet.method, URL, true );
addHeader( xmlHttp, requestSet.headerSet );
try{
xmlHttp.send( JSON.stringify( requestSet.parameterSet ) );
}catch( error ){
onResponseCallback( error, null, xmlHttp );
}
return requestEngine;
};
var requestEngine = { };
Object.defineProperty( requestEngine, "get",
{
"writable": false,
"enumerable": false,
"configurable": false,
"value": get
} );
Object.defineProperty( requestEngine, "post",
{
"writable": false,
"enumerable": false,
"configurable": false,
"value": post
} );
Object.defineProperty( requestEngine, "send",
{
"writable": false,
"enumerable": false,
"configurable": false,
"value": send
} );
Object.defineProperty( requestEngine, "setHeader",
{
"writable": false,
"enumerable": false,
"configurable": false,
"value": setHeader
} );
Object.defineProperty( requestEngine, "setParameter",
{
"writable": false,
"enumerable": false,
"configurable": false,
"value": setParameter
} );
Object.defineProperty( requestEngine, "setQuery",
{
"writable": false,
"enumerable": false,
"configurable": false,
"value": setQuery
} );
Object.defineProperty( requestEngine, "setMethod",
{
"writable": false,
"enumerable": false,
"configurable": false,
"value": setMethod
} );
return requestEngine;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment