Make an HTTP Request

[edit] Step 1 – How to Make an HTTP Request
In order to make an HTTP request to the server using JavaScript, you need an instance of a class that provides this functionality. Such a class was originally introduced in Internet Explorer as an ActiveX object, called XMLHTTP. Then Mozilla, Safari and other browsers followed, implementing an XMLHttpRequest class that supports the methods and properties of Microsoft's original ActiveX object.

As a result, in order to create a cross-browser instance (object) of the required class, you can do:

var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}

(For illustration purposes, the above is a bit simplified version of the code to be used for creating an XMLHTTP instance. For a more real-life example, see step 3 of this article.)

Some versions of some Mozilla browsers won't work properly if the response from the server doesn't have an XML mime-type header. To satisfy this, you can use an extra method call to override the header sent by the server, just in case it's not text/xml.

httpRequest = new XMLHttpRequest();
httpRequest.overrideMimeType('text/xml');
Next, you need to decide what you want to do after you receive the server response to your request. At this stage, you just need to tell the HTTP request object which JavaScript function will do the work of processing the response. This is done by setting the onreadystatechange property of the object to the name of the JavaScript function you plan to use, like this:

httpRequest.onreadystatechange = nameOfTheFunction;

Note that there are no brackets after the function name and no parameters passed, because you're simply assigning a reference to the function, rather than actually calling it. Also, instead of giving a function name, you can use the JavaScript technique of defining functions on the fly (called "anonymous function") and define the actions that will process the response right away, like this:

httpRequest.onreadystatechange = function(){
// do the thing
};

Next, after you've declared what will happen as soon as you receive the response, you need to actually make the request. You need to call the open() and send() methods of the HTTP request class, like this:

httpRequest.open('GET', 'http://www.example.org/some.file', true);
httpRequest.send(null);

The first parameter of the call to open() is the HTTP request method – GET, POST, HEAD or any other method you want to use and that is supported by your server. Keep the method capitalized as per the HTTP standard; otherwise some browsers (like Firefox) might not process the request. For more information on the possible HTTP request methods you can check the W3C specs
The second parameter is the URL of the page you're requesting. As a security feature, you cannot call pages on 3rd-party domains. Be sure to use the exact domain name on all of your pages or you will get a 'permission denied' error when you call open(). A common pitfall is accessing your site by domain.tld, but attempting to call pages with www.domain.tld.
The third parameter sets whether the request is asynchronous. If TRUE, the execution of the JavaScript function will continue while the response of the server has not yet arrived. This is the A in AJAX.
The parameter to the send() method can be any data you want to send to the server if POST-ing the request. The data should be in the form of a query string, like:

name=value&anothername=othervalue&so=on

Note that if you want to POST data, you have to change the MIME type of the request using the following line:

httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Otherwise, the server will discard the POSTed data.

[edit] Step 2 – Handling the Server Response
Remember that when you were sending the request, you provided the name of a JavaScript function that is designed to handle the response.

httpRequest.onreadystatechange = nameOfTheFunction;
Let's see what this function should do. First, the function needs to check for the state of the request. If the state has the value of 4, that means that the full server response is received and it's OK for you to continue processing it.

if (httpRequest.readyState == 4) {
// everything is good, the response is received
} else {
// still not ready
}
The full list of the readyState values is as follows:

0 (uninitialized)
1 (loading)
2 (loaded)
3 (interactive)
4 (complete)
(Source)

The next thing to check is the status code of the HTTP server response. All the possible codes are listed on the W3C site. For our purposes we are only interested in 200 OK response.

if (httpRequest.status == 200) {
// perfect!
} else {
// there was a problem with the request,
// for example the response may be a 404 (Not Found)
// or 500 (Internal Server Error) response codes
}
Now after you've checked the state of the request and the HTTP status code of the response, it's up to you to do whatever you want with the data the server has sent to you. You have two options to access that data:

httpRequest.responseText – will return the server response as a string of text
httpRequest.responseXML – will return the response as an XMLDocument object you can traverse using the JavaScript DOM functions
[edit] Step 3 – A Simple Example
Let's put it all together and do a simple HTTP request. Our JavaScript will request an HTML document, test.html, which contains the text "I'm a test." and then we'll alert() the contents of the test.html file.

<script type="text/javascript" language="javascript">
function makeRequest(url) {
var httpRequest;

if (window.XMLHttpRequest) { // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
if (httpRequest.overrideMimeType) {
httpRequest.overrideMimeType('text/xml');
// See note below about this line
}
}
else if (window.ActiveXObject) { // IE
try {
httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}

if (!httpRequest) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
httpRequest.onreadystatechange = function() { alertContents(httpRequest); };
httpRequest.open('GET', url, true);
httpRequest.send('');

}

function alertContents(httpRequest) {

if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem with the request.');
}
}

}
</script>
<span
style="cursor: pointer; text-decoration: underline"
onclick="makeRequest('test.html')">
Make a request
</span>

In this example:

The user clicks the link "Make a request" in the browser;
This calls the makeRequest() function with a parameter – the name test.html of an HTML file in the same directory;
The request is made and then (onreadystatechange) the execution is passed to alertContents();
alertContents() checks if the response was received and it's an OK and then alert()s the contents of the test.html file.
Note: The line httpRequest.overrideMimeType('text/xml'); above will cause JavaScript Console errors in Firefox 1.5 or later, as documented in bug 311724 if the page retrieve by XMLHttpRequest is not valid XML (e.g., if it is plain text). This is actually correct behavior; this article will be revised soon to address this change.

Note 2: if you are sending a request to a piece of code that will return XML, rather than to a static XML file, you must set some response headers if your page is to work in Internet Explorer in addition to Mozilla. If you do not set header Content-Type: application/xml, IE will throw a JavaScript error, 'Object Expected', after the line where you try to access an XML element. If you do not set header Cache-Control: no-cache the browser will cache the response and never re-submit the request, making debugging "challenging."

Note 3: if the httpRequest variable is used globally, competing functions calling makeRequest() may overwrite each other, causing a race condition. Declaring the httpRequest variable local to the function and passing it to the alertContent() function prevents the race condition.

Note 4: To register the callback function onreadystatechange, you cannot have any arguments. That's why the following code does not work:

httpRequest.onreadystatechange = alertContents(httpRequest); // (does not work)
So, to register the function successfully, you can either pass the arguments indirectly via the anonymous function or use httpRequest as a global variable. Examples follow:

httpRequest.onreadystatechange = function() { alertContents(httpRequest); }; //1 (simultaneous request)
httpRequest.onreadystatechange = alertContents; //2 (global variable)
Method 1 lets you have several requests processed simultaneously, while method 2 is used if httpRequest is a global variable.


Note 5: In the event of a communication error (such as the webserver going down), an exception will be thrown in the onreadystatechange method when attempting to access the .status variable. Make sure that you wrap your if...then statement in a try...catch. (See: bug 238559).

function alertContents(httpRequest) {

try {
if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem with the request.');
}
}
}
catch( e ) {
alert('Caught Exception: ' + e.description);
}

}
[edit] Step 4 – Working with the XML Response
In the previous example, after the response to the HTTP request was received we used the responseText property of the request object, which contained the contents of the test.html file. Now let's try the responseXML property.

First off, let's create a valid XML document that we'll request later on. The document (test.xml) contains the following:

<?xml version="1.0" ?>
<root>
I'm a test.
</root>
In the script we only need to change the request line to:

...
onclick="makeRequest('test.xml')">

...
Then in alertContents(), we need to replace the line alert(httpRequest.responseText); with:

var xmldoc = httpRequest.responseXML;
var root_node = xmldoc.getElementsByTagName('root').item(0);
alert(root_node.firstChild.data);

This code takes the XMLDocument object given by responseXML and uses DOM methods to access some of the data contained in the XML document. You can see the test.xml here and the updated test script here.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 JavaScript 中发送 HTTP 请求的方法有多种,常见的方法包括使用 XMLHttpRequest 对象和使用 fetch API。 XMLHttpRequest 示例代码: ``` var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data.json', true); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(); ``` fetch API 示例代码: ``` fetch('https://api.example.com/data.json') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error)); ``` 注意:这只是最简单的 HTTP GET 请求的例子,实际使用中你需要根据需求进行更多的设置,例如设置请求头、发送请求体等。 ### 回答2: 在JavaScript中,可以使用内置的XMLHttpRequest对象来发送HTTP请求。下面是一个使用XMLHttpRequest对象发送GET请求的示例: ```javascript // 创建XMLHttpRequest对象 var xhr = new XMLHttpRequest(); // 设置请求方法和URL xhr.open('GET', 'http://example.com/api', true); // 设置响应类型 xhr.responseType = 'json'; // 发送请求 xhr.send(); // 当请求状态改变时执行回调函数 xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { // 请求成功,处理响应数据 console.log(xhr.response); } else { // 请求失败,处理错误 console.error(xhr.statusText); } } }; ``` 以上代码创建了一个XMLHttpRequest对象,并使用`open`方法设置了GET请求的URL和异步标志位。然后,通过`send`方法发送请求。 在`onreadystatechange`回调函数中,检查请求状态(`readyState`)和响应状态(`status`)来确定请求是否完成。如果`readyState`等于4,表示请求已完成;如果`status`等于200,表示请求成功。 你也可以使用第三方库,如axios或fetch,来简化HTTP请求。这些库提供了更简洁的API,并支持更多的功能,比如发送POST请求和设置请求头。 ### 回答3: 在JavaScript中进行HTTP请求有多种方法。最常见的是使用内置的XMLHttpRequest对象。 可以通过创建新的XMLHttpRequest实例来发送HTTP请求。以下是一个简单的示例: ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data', true); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(); ``` 上述代码创建了一个GET请求,向"https://api.example.com/data"地址发送请求。当请求状态改变时,将触发`onreadystatechange`事件处理函数。如果请求已成功完成(`readyState`为4,`status`为200),则在控制台打印响应的文本。 除了使用`open`和`send`方法之外,还可以通过`setRequestHeader`方法设置HTTP标头,以及通过`getResponseHeader`方法获取响应标头。 另一种进行HTTP请求的常见方法是使用基于Promise的fetch API。它提供了更简洁和现代的方式来发送HTTP请求。以下是使用fetch API发送GET请求的示例: ```javascript fetch('https://api.example.com/data') .then(function(response) { if (response.ok) { return response.text(); } throw new Error('Network response was not ok.'); }) .then(function(data) { console.log(data); }) .catch(function(error) { console.log('Error:', error.message); }); ``` 上述代码通过调用fetch函数发送GET请求,并返回一个Promise对象。然后可以根据响应的状态确定是否处理响应或抛出错误。最后,可以在控制台打印响应的文本。 这里只是展示了两种常见的进行HTTP请求的方法,JavaScript中还有其他的库和框架可以帮助处理HTTP请求,比如Axios、jQuery等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值