Ajax는 더 좋고, 더 빠르고, 더 대화형인 웹 애플리케이션을 만드는 데 사용되는 기술입니다. 이 기사에서는 JavaScript를 사용하여 AJAX 호출 및 요청을 수행하는 방법을 보여줍니다.
이 튜토리얼에서는 JS를 사용하여 AJAX 호출을 수행하는 방법을 배웁니다.
AJAX라는 용어는 Asynchronous JavaScript and XML을 의미합니다.
AJAX는 JS에서 리소스를 얻기 위해 비동기 네트워크 요청을 만드는 데 사용됩니다. 물론 이름에서 알 수 있듯이 리소스는 XML에만 국한되지 않고 JSON, HTML 또는 일반 텍스트와 같은 리소스를 얻는 데에도 사용할 수 있습니다.
네트워크를 요청하고 서버에서 데이터를 가져오는 방법에는 여러 가지가 있습니다. 하나씩 소개하겠습니다.
XMLHttpRequest
객체(약어 XMLHttpRequest
对象(简称XHR)在较早的时候用于从服务器异步检索数据。
之所以使用XML,是因为它首先用于检索XML数据。现在,它也可以用来检索JSON, HTML或纯文本。
事例 2.1: GET
function success() { var data = JSON.parse(this.responseText) console.log(data) } function error (err) { console.log('Error Occurred:', err) } var xhr = new XMLHttpRequest() xhr.onload = success xhr.onerror = error xhr.open("GET", ""https://jsonplaceholder.typicode.com/posts/1") xhr.send()
我们看到,要发出一个简单的GET请求,需要两个侦听器来处理请求的成功和失败。我们还需要调用open()
和send()
方法。来自服务器的响应存储在responseText
变量中,该变量使用JSON.parse()
转换为JavaScript 对象。
function success() { var data = JSON.parse(this.responseText); console.log(data); } function error(err) { console.log('Error Occurred :', err); } var xhr = new XMLHttpRequest(); xhr.onload = success; xhr.onerror = error; xhr.open("POST", "https://jsonplaceholder.typicode.com/posts"); xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); xhr.send(JSON.stringify({ title: 'foo', body: 'bar', userId: 1 }) );
我们看到POST请求类似于GET请求。 我们需要另外使用setRequestHeader
设置请求标头“Content-Type” ,并使用send方法中的JSON.stringify
将JSON正文作为字符串发送。
2.3 XMLHttpRequest vs Fetch
早期的开发人员,已经使用了好多年的 XMLHttpRequest
来请求数据了。 现代的fetch API
允许我们发出类似于XMLHttpRequest(XHR)
的网络请求。 主要区别在于fetch()
API使用Promises,它使 API更简单,更简洁,避免了回调地狱。
Fetch 是一个用于进行AJAX调用的原生 JavaScript API,它得到了大多数浏览器的支持,现在得到了广泛的应用。
3.1 API用法
fetch(url, options) .then(response => { // handle response data }) .catch(err => { // handle errors });
API参数
fetch()
API有两个参数
1、url是必填参数,它是您要获取的资源的路径。
2、options
是一个可选参数。不需要提供这个参数来发出简单的GET请求。
headers: 请求头,如 { “Content-type”: “application/json; charset=UTF-8” }
API返回Promise对象
fetch()
API返回一个promise对象。
.catch()
块中处理。200
、404
、500
),则promise将被解析。响应对象可以在.then()
块中处理。错误处理
请注意,对于成功的响应,我们期望状态代码为200
(正常状态),但是即使响应带有错误状态代码(例如404
(未找到资源)和500
(内部服务器错误)),fetch()
API 的状态也是 resolved
,我们需要在.then()
块中显式地处理那些。
我们可以在response
对象中看到HTTP状态:
true
。3.2 示例:GET
const getTodoItem = fetch('https://jsonplaceholder.typicode.com/todos/1') .then(response => response.json()) .catch(err => console.error(err)); getTodoItem.then(response => console.log(response));
Response { userId: 1, id: 1, title: "delectus aut autem", completed: false }
在上面的代码中需要注意两件事:
fetch
API返回一个promise对象,我们可以将其分配给变量并稍后执行。
我们还必须调用response.json()
将响应对象转换为JSON
错误处理
我们来看看当HTTP GET
请求抛出500错误时会发生什么:
fetch('http://httpstat.us/500') // this API throw 500 error .then(response => () => { console.log("Inside first then block"); return response.json(); }) .then(json => console.log("Inside second then block", json)) .catch(err => console.error("Inside catch block:", err));
Inside first then block ➤ ⓧ Inside catch block: SyntaxError: Unexpected token I in JSON at position 4
我们看到,即使API抛出500错误,它仍然会首先进入then()
块,在该块中它无法解析错误JSON并抛出catch()
块捕获的错误。
这意味着如果我们使用fetch()
XHR
XML을 사용하는 이유는 애초에 XML 데이터를 검색하는 데 사용되기 때문입니다. 이제 JSON, HTML 또는 일반 텍스트를 검색하는 데에도 사용할 수 있습니다.
🎜🎜사례 2.1: GET🎜🎜🎜fetch('http://httpstat.us/500') .then(handleErrors) .then(response => response.json()) .then(response => console.log(response)) .catch(err => console.error("Inside catch block:", err)); function handleErrors(response) { if (!response.ok) { // throw error based on custom conditions on response throw Error(response.statusText); } return response; }🎜간단한 GET 요청을 만들려면 요청의 성공과 실패를 처리하기 위해 두 명의 리스너가 필요하다는 것을 알 수 있습니다. 또한
open()
및 send()
메서드를 호출해야 합니다. 서버의 응답은 JSON.parse()
를 사용하여 JavaScript 개체로 변환되는 responseText
변수에 저장됩니다. 🎜➤ Inside catch block: Error: Internal Server Error at handleErrors (Script snippet %239:9)🎜POST 요청이 GET 요청과 유사하다는 것을 알 수 있습니다.
setRequestHeader
를 사용하여 요청 헤더 "Content-Type"을 추가로 설정하고 전송 메서드에서 JSON.stringify
를 사용하여 JSON 본문을 문자열로 보내야 합니다. 🎜🎜🎜🎜2.3 XMLHttpRequest 대 Fetch🎜🎜🎜🎜초기 개발자들은 수년 동안 XMLHttpRequest
를 사용하여 데이터를 요청해 왔습니다. 최신 fetch API
를 사용하면 XMLHttpRequest(XHR)
와 유사한 네트워크 요청을 할 수 있습니다. 주요 차이점은 fetch()
API가 🎜Promises🎜를 사용한다는 점입니다. 이는 API를 더 간단하고 간결하게 만들고 콜백 지옥을 방지합니다. 🎜fetch('https://jsonplaceholder.typicode.com/todos', { method: 'POST', body: JSON.stringify({ completed: true, title: 'new todo item', userId: 1 }), headers: { "Content-type": "application/json; charset=UTF-8" } }) .then(response => response.json()) .then(json => console.log(json)) .catch(err => console.log(err))🎜API 매개변수🎜🎜
fetch()
API에는 두 개의 매개변수가 있습니다🎜🎜1과 🎜url🎜은 필수 매개변수이며, 이는 획득하려는 리소스입니다. . 길. 🎜🎜2. 옵션
은 선택적 매개변수입니다. 간단한 GET 요청을 만들기 위해 이 매개변수를 제공할 필요가 없습니다. 🎜{ “Content-type”: “application/json; UTF -8” }
🎜fetch()
API는 Promise 객체를 반환합니다. 🎜.catch()
블록에서 처리됩니다. 200
, 404
, 500
)가 있는 경우 Promise는 의지가 분석됩니다. 응답 객체는 .then()
블록에서 처리될 수 있습니다. 200
(정상 상태)가 예상되지만 응답에 오류가 있는 경우에도 마찬가지입니다. 상태 코드(예: 404
(리소스를 찾을 수 없음) 및 500
(내부 서버 오류)), fetch()
API의 상태는 다음과 같습니다. 또한 해결
code>되었으므로 .then()
블록에서 명시적으로 처리해야 합니다. 🎜🎜응답
개체에서 HTTP 상태를 확인할 수 있습니다. 🎜true
. Response ➤ {completed: true, title: "new todo item", userId: 1, id: 201}
// 在chrome控制台中引入脚本的方法 var script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'https://unpkg.com/axios/dist/axios.min.js'; document.head.appendChild(script);🎜위 코드에서 주목해야 할 두 가지 사항이 있습니다:🎜
fetch
API는 변수에 할당하고 나중에 실행할 수 있는 promise 개체를 반환합니다. 🎜response.json()
도 호출해야 합니다🎜GET
요청에서 500 오류가 발생하면 어떤 일이 발생하는지 확인하세요. 🎜axios.get('https://jsonplaceholder.typicode.com/todos/1') .then(response => console.log(response.data)) .catch(err => console.error(err));
Response { userId: 1, id: 1, title: "delectus aut autem", completed: false }🎜API에서 500 오류가 발생하더라도 여전히
then()
으로 먼저 이동합니다. 오류 JSON을 구문 분석하지 못하고 catch()
블록에서 포착한 오류를 발생시키는 블록입니다. 🎜🎜즉, fetch()
API를 사용하는 경우 다음과 같이 해당 오류를 명시적으로 처리해야 합니다.-🎜axios.get('http://httpstat.us/500') .then(response => console.log(response.data)) .catch(err => console.error("Inside catch block:", err));
Inside catch block: Error: Network Error🎜🎜🎜3.3 예: POST🎜🎜🎜
fetch('https://jsonplaceholder.typicode.com/todos', { method: 'POST', body: JSON.stringify({ completed: true, title: 'new todo item', userId: 1 }), headers: { "Content-type": "application/json; charset=UTF-8" } }) .then(response => response.json()) .then(json => console.log(json)) .catch(err => console.log(err))
Response ➤ {completed: true, title: "new todo item", userId: 1, id: 201}
在上面的代码中需要注意两件事:-
POST
请求类似于GET
请求。 我们还需要在fetch()
API的第二个参数中发送method
,body
和headers
属性。
我们必须需要使用 JSON.stringify()
将对象转成字符串请求body
参数
Axios API非常类似于fetch API,只是做了一些改进。我个人更喜欢使用Axios API而不是fetch()
API,原因如下:
axios.get()
,为 POST 请求提供 axios.post()
等提供不同的方法,这样使我们的代码更简洁。catch()
块中处理的错误,因此我们无需显式处理这些错误。4.1 示例:GET
// 在chrome控制台中引入脚本的方法 var script = document.createElement('script'); script.type = 'text/javascript'; script.src = 'https://unpkg.com/axios/dist/axios.min.js'; document.head.appendChild(script);
axios.get('https://jsonplaceholder.typicode.com/todos/1') .then(response => console.log(response.data)) .catch(err => console.error(err));
Response { userId: 1, id: 1, title: "delectus aut autem", completed: false }
我们可以看到,我们直接使用response获得响应数据。数据没有任何解析对象,不像fetch()
API。
错误处理
axios.get('http://httpstat.us/500') .then(response => console.log(response.data)) .catch(err => console.error("Inside catch block:", err));
Inside catch block: Error: Network Error
我们看到,500错误也被catch()
块捕获,不像fetch()
API,我们必须显式处理它们。
4.2 示例:POST
axios.post('https://jsonplaceholder.typicode.com/todos', { completed: true, title: 'new todo item', userId: 1 }) .then(response => console.log(response.data)) .catch(err => console.log(err))
{completed: true, title: "new todo item", userId: 1, id: 201}
我们看到POST方法非常简短,可以直接传递请求主体参数,这与fetch()API不同。
更多编程相关知识,请访问:编程视频!!
위 내용은 JavaScript를 사용하여 AJAX 호출 및 요청을 수행하는 방법에 대한 간략한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!