Keywords: XMLHttpRequest | GET request | query string | URL encoding | JavaScript | AJAX
Abstract: This article provides an in-depth exploration of technical details for passing variables to servers using XMLHttpRequest, focusing on query string construction in GET requests, including manual concatenation, utility function encapsulation, and modern URL API usage. It explains the importance of URL encoding, compares GET and POST methods in terms of security and visibility, and demonstrates the complete process from basic implementation to advanced optimization through comprehensive code examples. Additionally, the article discusses critical practical development issues such as error handling, performance optimization, and cross-browser compatibility, offering thorough technical reference for front-end developers.
Core Mechanisms of Variable Passing with XMLHttpRequest
In web development, XMLHttpRequest (XHR) serves as the fundamental technology for asynchronous communication between clients and servers. Passing variables to servers is one of the most common use cases for XHR, requiring developers to select appropriate methods and implementations based on specific requirements.
Query String Construction in GET Requests
The standard approach for passing variables using the GET method is through query strings. Query strings are appended to the URL end, starting with a question mark (?) and separating parameters with ampersands (&). The basic format is: ?key1=value1&key2=value2.
A complete GET request example:
var url = "handler_address";
var params = "variable1=value1&variable2=value2";
var http = new XMLHttpRequest();
http.open("GET", url + "?" + params, true);
http.onreadystatechange = function() {
if (http.readyState == 4 && http.status == 200) {
console.log(http.responseText);
}
}
http.send(null);Server-side (e.g., PHP) can receive these parameters via the $_GET superglobal array. For instance, $_GET['variable1'] returns "value1".
Importance of URL Encoding
When constructing query strings, parameter values must be URL encoded. Special characters like spaces, question marks, and equals signs can cause URL parsing errors if not encoded. JavaScript provides the encodeURIComponent() function for encoding:
var value = "special characters & spaces";
var encodedValue = encodeURIComponent(value);
// Result: "%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%20%26%20%E7%A9%BA%E6%A0%BC"In practice, always encode each parameter value:
var params = "name=" + encodeURIComponent(userName) + "&email=" + encodeURIComponent(userEmail);Utility Function Encapsulation for Parameter Building
Manual query string concatenation becomes tedious and error-prone with numerous parameters. A utility function can automate encoding and formatting:
function buildQueryParams(paramsObject) {
var paramArray = Object.keys(paramsObject).map(function(key) {
return encodeURIComponent(key) + "=" + encodeURIComponent(paramsObject[key]);
});
return "?" + paramArray.join("&");
}
// Usage example
var endpoint = "https://api.example.com/endpoint";
var params = {
page: 1,
perPage: 20,
searchTerm: "JavaScript tutorial"
};
var fullURL = endpoint + buildQueryParams(params);
// Result: "https://api.example.com/endpoint?%E9%A1%B5%E7%A0%81=1&%E6%AF%8F%E9%A1%B5%E6%95%B0%E9%87%8F=20&%E6%90%9C%E7%B4%A2%E5%85%B3%E9%94%AE%E8%AF%8D=JavaScript%E6%95%99%E7%A8%8B"Using Modern URL APIs
Modern browsers offer URL and URLSearchParams APIs for more elegant URL handling:
// Method 1: Adding parameters individually
const targetURL = new URL('https://example.com/endpoint');
const paramsObj = new URLSearchParams();
paramsObj.set('category', 'technology');
paramsObj.set('sort', 'date');
targetURL.search = paramsObj.toString();
// Method 2: Creating from object directly
const paramData = {
userId: 12345,
token: 'abc123def456'
};
const targetURL2 = new URL('https://example.com/endpoint');
targetURL2.search = new URLSearchParams(paramData).toString();URLSearchParams automatically handles encoding and provides rich methods for manipulating query parameters, such as append(), delete(), and get().
Comparison of GET and POST Methods
While this article primarily discusses GET, understanding GET vs. POST differences is crucial for method selection:
- GET method: Parameters pass via URL, visible in address bars, browser history, and server logs. Suitable for data retrieval and idempotent operations. Has length limits (typically ~2048 characters).
- POST method: Parameters pass in request body, invisible in URL. Suitable for sensitive data submission, non-idempotent operations, and large data transfers.
POST request example:
var http = new XMLHttpRequest();
var url = "handler_address";
var params = "username=admin&password=encryptedPassword";
http.open("POST", url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = function() {
if (http.readyState == 4 && http.status == 200) {
console.log(http.responseText);
}
}
http.send(params);Error Handling and Best Practices
Beyond basic parameter passing, practical development requires considering:
- Error handling: Checking HTTP status codes, handling network and server errors.
- Timeout settings: Setting timeouts for unresponsive requests.
- Cross-origin requests: Handling CORS (Cross-Origin Resource Sharing) headers.
- Security: Encrypting sensitive data, using HTTPS protocol.
- Performance optimization: Combining requests, using caching, reducing data transfer.
A complete example with error handling:
function sendRequest(method, url, params, callback) {
var http = new XMLHttpRequest();
var requestURL = url;
if (method === "GET" && params) {
requestURL += "?" + buildQueryParams(params);
}
http.open(method, requestURL, true);
http.timeout = 10000; // 10-second timeout
http.onreadystatechange = function() {
if (http.readyState === 4) {
if (http.status >= 200 && http.status < 300) {
callback(null, http.responseText);
} else {
callback(new Error("Request failed with status: " + http.status), null);
}
}
};
http.ontimeout = function() {
callback(new Error("Request timeout"), null);
};
if (method === "POST" && params) {
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http.send(buildQueryParams(params).substring(1)); // Remove leading "?"
} else {
http.send(null);
}
}Compatibility Considerations
Although modern browsers support XMLHttpRequest, practical projects require attention to:
URLandURLSearchParamsAPIs lack IE support, needing polyfills or alternatives.- Older browsers may require
XMLHttpRequestsupport detection. - Consider
fetchAPI as a modern alternative, noting differences from XHR.
Conclusion
Passing variables via XMLHttpRequest is a fundamental web development skill. The GET method uses query strings requiring proper URL encoding. For complex scenarios, utility functions or modern URL APIs simplify development. Developers should choose GET or POST based on data sensitivity and operation nature, implementing appropriate error handling and security measures. As web technologies evolve, while new APIs like fetch emerge, understanding XHR principles remains essential for legacy code handling and deep HTTP communication mechanism comprehension.