最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS發(fā)起HTTP請求的多種方式總結(jié)

 更新時間:2023年11月07日 16:39:44   作者:通往自由之路  
這篇文章主要為大家詳細(xì)介紹了JavaScript發(fā)起HTTP請求的多種方式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

為了更好的理解HTTP協(xié)議先來了解一下IP和TCP協(xié)議。

  • IP(Internet Protocol)協(xié)議和TCP(Transmission Control Protocol)協(xié)議是互聯(lián)網(wǎng)的基礎(chǔ)協(xié)議,它們位于網(wǎng)絡(luò)協(xié)議棧的較低層次,主要負(fù)責(zé)數(shù)據(jù)包的發(fā)送和接收。
  • IP協(xié)議是網(wǎng)絡(luò)層的協(xié)議,主要負(fù)責(zé)將數(shù)據(jù)包發(fā)送到正確的設(shè)備。每個連接到互聯(lián)網(wǎng)的設(shè)備都有一個唯一的IP地址,IP協(xié)議就是通過這個地址將數(shù)據(jù)包發(fā)送到正確的設(shè)備。
  • TCP協(xié)議是傳輸層的協(xié)議,主要負(fù)責(zé)在兩個設(shè)備之間建立可靠的連接,并保證數(shù)據(jù)包的順序和完整性。TCP協(xié)議會對數(shù)據(jù)包進(jìn)行編號,確保接收端能夠按照正確的順序接收數(shù)據(jù)包,如果有數(shù)據(jù)包丟失,TCP協(xié)議還會要求發(fā)送端重新發(fā)送。

HTTP(HyperText Transfer Protocol)協(xié)議則位于應(yīng)用層,它是建立在TCP協(xié)議之上的。HTTP協(xié)議定義了客戶端和服務(wù)器之間如何進(jìn)行數(shù)據(jù)交換,例如請求的格式、響應(yīng)的格式等。當(dāng)在瀏覽器中輸入一個網(wǎng)址時,瀏覽器就會通過HTTP協(xié)議向服務(wù)器發(fā)送請求,并接收服務(wù)器的響應(yīng)。

所以,HTTP協(xié)議依賴于TCP協(xié)議來傳輸數(shù)據(jù),而TCP協(xié)議又依賴于IP協(xié)議來將數(shù)據(jù)包發(fā)送到正確的設(shè)備。

筆者屬于前端開發(fā),接下來的一段時間要總結(jié)在前端開發(fā)領(lǐng)域處于戰(zhàn)略地位的知識點。HTTP請求就屬于前端戰(zhàn)略知識點之一。

本文來總結(jié)下發(fā)起HTTP的幾種方式。

使用 XMLHttpRequest

XMLHttpRequest是比較底層也比較早期的發(fā)起http請求的方式,XMLHttpRequest不是基于Promise的所以往往在使用XMLHttpRequest時需要手動封裝為Promise形式。

export const ajax = function (config) {
    return new Promise((resolve, reject) => {
      // 2. 發(fā)起XHR請求,默認(rèn)請求方法為GET
      const xhr = new XMLHttpRequest()
      xhr.open(config.method || 'GET', config.url)
      xhr.setRequestHeader('Authorization', '2f3e1153a4ef0cc3a96fde17509a8a4b8cd428c5fbf0bf60e7133a1d3ca5a571');
      xhr.setRequestHeader('Content-Type','application/json')

      xhr.responseType = 'blob';   
      xhr.addEventListener('loadend', () => {
        // 3. 調(diào)用成功/失敗的處理程序
        if (xhr.status >= 200 && xhr.status < 300) {
            resolve(xhr.response)
        //   typeof xhr.response === 'string' ? resolve(JSON.parse(xhr.response)) : resolve(xhr.response)
        } else {
          reject(new Error(xhr.response))
        }
      })
      xhr.send(JSON.stringify(config.data))
    })
  }

使用axios

axios實際是對XMLHttpRequest的封裝

axios({
  method: 'post',
  url: 'https://api.example.com/data',
  data: {
    key: 'value'
  },
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(function (response) {
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});

使用Fetch

Fetch是比較現(xiàn)代的網(wǎng)絡(luò)請求接口,它也提供了一種跨網(wǎng)絡(luò)異步獲取資源。Fetch基于Promise設(shè)計。主要特點

  • 基于Promise:返回的Promise對象,可以使用then方法進(jìn)行鏈?zhǔn)秸{(diào)用,使得異步代碼更易于管理。
  • 靈活性:Fetch可以自定義請求的各種設(shè)置,如請求方法(GET、POST等)、請求頭、請求體等。
  • 支持跨域請求:Fetch支持CORS(跨源資源共享),可以進(jìn)行跨域請求。
  • 支持流處理:Fetch支持流處理,可以在數(shù)據(jù)完全接收到之前就開始處理數(shù)據(jù)。

基本使用

fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.log('Error:', error));

瀏覽器發(fā)起

瀏覽器作為web客戶端和服務(wù)端都屬于HTTP協(xié)議的設(shè)備。瀏覽器又通過HTTP協(xié)議與服務(wù)器發(fā)生交互,自然瀏覽器本身也具有發(fā)起HTTP請求的功能。

排除XMLHttpRequest、Fetch。瀏覽器自身還可以通過地址欄、通過html的相關(guān)標(biāo)簽發(fā)起HTTP請求。

html標(biāo)簽img、script、link、a、video、audio等都可以通過src或者h(yuǎn)ref屬性發(fā)情HTTP請求,當(dāng)然只能發(fā)起get請求。

還有html的form標(biāo)簽,可以發(fā)起get和post請求。

使用cURL

cURL是一個命令行工具,它允許通過各種協(xié)議向服務(wù)器發(fā)送請求并接收響應(yīng)。支持的協(xié)議非常多,包括 HTTP、HTTPS、FTP、FTPS、SFTP、SCP、LDAP、LDAPS、SMTP、POP3、IMAP、RTSP、RTMP、TELNET、TFTP等。

主要特點包括

  • 支持多協(xié)議:如上所述,cURL 支持非常多的協(xié)議,可以滿足各種網(wǎng)絡(luò)請求的需求。
  • 支持?jǐn)?shù)據(jù)上傳和下載:cURL 可以用于文件的上傳和下載,非常適合進(jìn)行批量操作。
  • 支持 SSL 證書:cURL 支持 SSL 證書,可以進(jìn)行安全的網(wǎng)絡(luò)請求。
  • 支持代理:cURL 支持通過代理服務(wù)器進(jìn)行網(wǎng)絡(luò)請求。
  • 支持用戶認(rèn)證:cURL 支持各種用戶認(rèn)證方式,如基本認(rèn)證、摘要認(rèn)證、NTLM 認(rèn)證等。

使用 cURL 發(fā)起一個 GET 請求

curl https://api.example.com/data

后端與后端之間

后端與后端之間也可以發(fā)起請求。這里java的HttpClient來發(fā)起HTTP的get請求

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI("http://example.com"))
                .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.body());
    }
}

上面首先創(chuàng)建了一個HttpClient對象,然后創(chuàng)建一個HttpRequest對象,指定了請求的URL。然后使用 HttpClient的send方法發(fā)送請求,并獲取到HttpResponse對象。

nginx中轉(zhuǎn)

nginx是比較知名的HTTP請求中間件。雖然不能直接發(fā)起HTTP,但可以作為代理,將請求做轉(zhuǎn)發(fā)。

一個簡單的Nginx配置示例,用于解決跨域問題

server {
    listen 80;
    server_name localhost;

    location /api/ {
        proxy_pass http://backend_server; # 這里是實際服務(wù)器的地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

上面設(shè)置了一個反向代理,將所有以 /api/ 開頭的請求轉(zhuǎn)發(fā)給 http://backend_server。這樣,前端就可以通過訪問 http://localhost/api/ 來進(jìn)行數(shù)據(jù)交互,而不會產(chǎn)生跨域問題。

小程序發(fā)起

微信小程序提供了wx.request來發(fā)起HTTP請求

wx.request({
  url: 'https://api.example.com/data', // 請求的 URL
  method: 'GET', // 請求方法
  data: { // 請求參數(shù)
    key: 'value'
  },
  header: { // 設(shè)置請求的 header
    'content-type': 'application/json'
  },
  success(res) { // 請求成功的回調(diào)函數(shù)
    console.log(res.data)
  },
  fail(err) { // 請求失敗的回調(diào)函數(shù)
    console.error(err)
  }
})

注意的是,由于微信小程序的安全策略,開發(fā)者需要在微信公眾平臺配置服務(wù)器域名,只有配置過的域名才能被微信小程序請求。此外,微信小程序不支持跨域請求,也不支持使用 Cookie。

android發(fā)起

在Android開發(fā)中,可以使用多種方式來發(fā)起HTTP請求,其中最常用的是使用OkHttp庫

// 創(chuàng)建 OkHttpClient
OkHttpClient client = new OkHttpClient();

// 創(chuàng)建 Request
Request request = new Request.Builder()
      .url("http://example.com")
      .build();

// 使用 OkHttpClient 發(fā)起請求
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            final String myResponse = response.body().string();

            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    // 在這里更新 UI
                    textView.setText(myResponse);
                }
            });
        }
    }
});

需要注意的是,網(wǎng)絡(luò)請求是在后臺線程中進(jìn)行的,所以不能直接在回調(diào)函數(shù)中更新UI。需要使用 runOnUiThread方法來在主線程中更新UI。

此外,由于Android不允許在主線程中進(jìn)行網(wǎng)絡(luò)請求,所以這段代碼需要在后臺線程中運行。

Websocket

WebSocket的握手過程使用的是HTTP協(xié)議,但一旦握手成功,服務(wù)器與客戶端之間的交互就完全依賴于WebSocket協(xié)議了。所以嚴(yán)格來說Websocket不算HTTP請求。

WebSocket協(xié)議支持全雙工通信,即服務(wù)器和客戶端可以同時發(fā)送接收信息,而HTTP協(xié)議是半雙工的,即任一時刻要么是請求要么是響應(yīng),不能同時進(jìn)行。

一個簡單的在瀏覽器中使用WebSocket的例子

// 創(chuàng)建 WebSocket 連接
var socket = new WebSocket('ws://localhost:8080');

// 連接打開時觸發(fā)
socket.onopen = function(event) {
  console.log('WebSocket is connected.');

  // 發(fā)送一個初始化消息
  socket.send('Hello, Server!');
};

// 接收到消息時觸發(fā)
socket.onmessage = function(event) {
  console.log('Received: ' + event.data);

  // 關(guān)閉連接
  socket.close();
};

// 連接關(guān)閉時觸發(fā)
socket.onclose = function(event) {
  console.log('WebSocket is closed.');
};

// 連接發(fā)生錯誤時觸發(fā)
socket.onerror = function(error) {
  console.log('WebSocket Error: ' + error);
};

到此這篇關(guān)于JS發(fā)起HTTP請求的多種方式總結(jié)的文章就介紹到這了,更多相關(guān)JS發(fā)起HTTP請求內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS判斷頁面是否出現(xiàn)滾動條的方法

    JS判斷頁面是否出現(xiàn)滾動條的方法

    這篇文章主要介紹了JS判斷頁面是否出現(xiàn)滾動條的方法,涉及javascript針對頁面元素的讀取與判定實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • js實現(xiàn)控制文件拖拽并獲取拖拽內(nèi)容功能

    js實現(xiàn)控制文件拖拽并獲取拖拽內(nèi)容功能

    本片文章主要給大家分享了用JS寫出控制文件拖拽并獲取拖拽內(nèi)容功能實現(xiàn)過程,以及代碼分享,有興趣的一起學(xué)習(xí)下。
    2018-02-02
  • javascript之IE版本檢測超簡單方法

    javascript之IE版本檢測超簡單方法

    下面小編就為大家?guī)硪黄猨avascript之IE版本檢測超簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 如何解決Webview和H5緩存問題確保每次加載最新版本的資源詳解

    如何解決Webview和H5緩存問題確保每次加載最新版本的資源詳解

    WebView在加載H5頁面時,可能會因為緩存機制導(dǎo)致用戶看到舊版本的頁面,這篇文章主要介紹了如何解決Webview和H5緩存問題確保每次加載最新版本的資源的相關(guān)資料,需要的朋友可以參考下
    2025-02-02
  • 前端如何用post的方式進(jìn)行eventSource請求

    前端如何用post的方式進(jìn)行eventSource請求

    這篇文章主要給大家介紹了關(guān)于前端如何用post的方式進(jìn)行eventSource請求的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-04-04
  • JavaScript彈出對話框的三種方式

    JavaScript彈出對話框的三種方式

    本文主要介紹了javascript中的三種彈出對話框,分別是alert()方法,confirm()方法,prompt()方法,對javascript彈出對話框相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • 微信小程序?qū)崿F(xiàn)canvas分享朋友圈海報

    微信小程序?qū)崿F(xiàn)canvas分享朋友圈海報

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)canvas分享朋友圈海報,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Javascript的getYear、getFullYear、getUTCFullYear異同分享

    Javascript的getYear、getFullYear、getUTCFullYear異同分享

    getYear、getFullYear、getUTCFullYear都是Javascript的Date對象的方法函數(shù)
    2011-11-11
  • canvas學(xué)習(xí)之API整理筆記(一)

    canvas學(xué)習(xí)之API整理筆記(一)

    本文主要介紹了canvas的相關(guān)知識。canvas本身很簡單,就是去學(xué)習(xí)它的API,多看實例,多自己動手練習(xí),多總結(jié)。本文介紹了很多小例,具有一定的參考價值,下面跟著小編一起來看下吧
    2016-12-12
  • javascript中alert()與console.log()的區(qū)別

    javascript中alert()與console.log()的區(qū)別

    我們在做js調(diào)試的時候使用 alert 可以顯示信息,調(diào)試程序,alert 彈出窗口會中斷程序, 如果要在循環(huán)中顯示信息,手點擊關(guān)閉窗口都累死。而且 alert 顯示對象永遠(yuǎn)顯示為[object ]。 自己寫的 log 雖然可以顯示一些 object 信息,但很多功能支持都沒有 console 好
    2015-08-08

最新評論

辽中县| 南木林县| 利津县| 东山县| 建水县| 蒙阴县| 南澳县| 文水县| 合阳县| 凉城县| 泾源县| 北票市| 无极县| 改则县| 来安县| 湖北省| 沂南县| 慈利县| 开江县| 石城县| 武安市| 郓城县| 桓台县| 革吉县| 潍坊市| 米林县| 涟水县| 白玉县| 凤城市| 青岛市| 师宗县| 高尔夫| 牙克石市| 上高县| 定结县| 高安市| 恩平市| 锡林郭勒盟| 盈江县| 彭水| 谢通门县|