【React Native】環境變量和封裝 fetch

環境變量和封裝fetch

環境變量

一般做開發,都會將接口地址配置到環境變量里。在Expo建的項目里,也可以使用環境變量。

在項目根目錄新建一個.env文件,里面添加上:

EXPO_PUBLIC_API_URL=http://localhost:3000

如果你用手機真機等局域網設備訪問,就改成電腦的IP地址,例如:

EXPO_PUBLIC_API_URL=http://192.168.x.xx:3000

Expo里:

  • 環境變量的命名,全部要大寫。
  • 而且必須以EXPO_PUBLIC開頭,后面再自己添加其他的。

安裝 urlcat

封裝請求文件之前,先去安裝下urlcat包:

npm i urlcat

利用它,可以非常簡單的拼接URL路徑和查詢參數。要不然就得自己很麻煩的處理URL路徑里的?號和&符號。

例如傳這些參數進去:

urlcat('http://localhost:3000', '/articles', { page: 1, limit: 10 })

它就會自動轉換成:

http://localhost:3000/articles?page=1&limit=10

封裝 request

  • headers里,告訴接口,返回的數據格式是JSON,發送的數據格式也是JSON
  • config里,將各種參數都丟進去。根據React Native官方文檔里的Fetch API 說明,傳給接口的數據,要將JavaScript對象轉為JSON字符串。
import urlcat from "urlcat";/*** 基礎請求函數* @param { string } url - API 請求路徑(如 '/articles')* @param { object } [options] - 請求配置項* @param { string } [options.method='GET'] - HTTP 方法* @param { object } [options.params] - URL 查詢參數(如 { page: 1, limit: 10 })* @param { object } [options.body] - 請求體數據* @returns { Promise<object> } 返回解析后的JSON數據** @example* // 基礎調用示例* request('/articles').then(data => console.log(data))** @example* // 帶查詢參數的 GET 請求* request('/articles', {*   params: { page: 1, limit: 10 }* })** @example* // POST 請求* // 提交表單數據* request('/auth/sign_in', {*   method: 'POST',*   body: { login: 'user', password: '123123' }* })*/
const request = async (url, { method = "GET", params, body } = {}) => {// 完整的接口地址const apiUrl = process.env.EXPO_PUBLIC_API_URL;const requestUrl = urlcat(apiUrl, url, params);// 請求頭const headers = {Accept: "application/json","Content-Type": "application/json",// 待完成:傳遞 token};const config = {method,headers,...(body && { body: JSON.stringify(body) }),};const response = await fetch(requestUrl, config);if (!response.ok) {// 待完成:登錄超時處理const { message, errors } = await response.json().catch(() => null);const error = new Error(message);error.status = response.status;error.errors = errors;throw error;}return await response.json();
};/*** GET 請求* @param { string } url - 請求地址* @param { object } [params] - 查詢參數* @returns { Promise<any> } 返回解析后的JSON數據** @example* // 基本 GET 請求* get('/articles').then(data => console.log(data))** @example* // 帶查詢參數的 GET 請求* get('/articles', { page: 1, limit: 10 })*/
export const get = (url, params) => request(url, { method: "GET", params });/*** POST 請求* @param { string } url - 請求地址* @param { object } body - 請求體數據* @returns { Promise<any> } 返回解析后的 JSON 數據** @example* // 提交表單數據* post('/auth/sign_in', { login: 'user', password: '123123' })*/
export const post = (url, body) => request(url, { method: "POST", body });/*** PUT 請求* @param { string } url - 請求地址* @param { object } body - 請求體數據* @returns { Promise<any> } 返回解析后的 JSON 數據** @example* // 更新數據* put('/users/info', { nickname: 'clwy', company: '長樂未央公司' })*/
export const put = (url, body) => request(url, { method: "PUT", body });/*** PATCH 請求* @param { string } url - 請求地址* @param { object } body - 請求體數據* @returns { Promise<any> } 返回解析后的 JSON 數據** @example* // 部分更新數據* 注意:本項目無任何接口使用 PATCH*/
export const patch = (url, body) => request(url, { method: "PATCH", body });/*** DELETE 請求* @param { string } url - 請求地址* @returns { Promise<any> } 返回解析后的 JSON 數據** @example* // 注銷用戶* del('/users/me')*/
export const del = (url) => request(url, { method: "DELETE" });export default request;
// const res = await fetch(`http://192.168.1.138/search?q=${keyword}`);
// const res = await request("/search", { params: { q: keyword } });
const res = await get("/search", { q: keyword });
  // 當依賴參數是一個對象或引用類型,例如 params,// 即使它的內容沒有變化,每次組件重新渲染時它的引用都會不同。// 從而導致 useEffect 不斷觸發,會造成無限循環請求。// 可以使用 JSON.stringify(params) 轉換為字符串,來解決這個問題。useEffect(() => {fetchData();}, [url, JSON.stringify(params)]);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89359.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 基礎命令詳解:從入門到實踐(1)

Linux 基礎命令詳解&#xff1a;從入門到實踐&#xff08;1&#xff09; 前言 在 Linux 操作系統中&#xff0c;命令行是高效管理系統、操作文件的核心工具。無論是開發者、運維工程師還是Linux愛好者&#xff0c;掌握基礎命令都是入門的第一步。本文將圍繞Linux命令的結構和常…

基于 SpringBoot+VueJS 的私人牙科診所管理系統設計與實現

基于 SpringBootVueJS 的私人牙科診所管理系統設計與實現摘要隨著人們對口腔健康重視程度的不斷提高&#xff0c;私人牙科診所的數量日益增多&#xff0c;對診所管理的信息化需求也越來越迫切。本文設計并實現了一個基于 SpringBoot 和 VueJS 的私人牙科診所管理系統&#xff0…

華為云Flexus+DeepSeek征文|體驗華為云ModelArts快速搭建Dify-LLM應用開發平臺并創建天氣預報大模型

華為云FlexusDeepSeek征文&#xff5c;體驗華為云ModelArts快速搭建Dify-LLM應用開發平臺并創建天氣預報大模型 什么是華為云ModelArts 華為云ModelArts ModelArts是華為云提供的全流程AI開發平臺&#xff0c;覆蓋從數據準備到模型部署的全生命周期管理&#xff0c;幫助企業和開…

Mysql系列--0、數據庫基礎

目錄 一、概念 1.1什么是數據庫 1.2什么是mysql 1.3登錄mysql 1.4主流數據庫 二、Mysql與數據庫 三、Mysql架構 四、SQL分類 五、存儲引擎 5.1概念 5.2查看引擎 5.3存儲引擎對比 一、概念 1.1什么是數據庫 由于文件保存數據存在文件的安全性問題 文件不利于數據查詢和管理…

深度學習和神經網絡的介紹

一.前言本期不涉及任何代碼&#xff0c;本專欄剛開始和大家介紹了一下機器學習&#xff0c;而本期就是大家介紹一下深度學習還有神經網絡&#xff0c;作為一個了解就好。二.深度學習2.1 什么是深度學習&#xff1f;在介紹深度學習之前&#xff0c;我們先看下??智能&#xff0…

AI驅動的軟件工程(下):AI輔助的質檢與交付

&#x1f4da; 系列文章導航 AI驅動的軟件工程&#xff08;上&#xff09;&#xff1a;人機協同的設計與建模 AI驅動的軟件工程&#xff08;中&#xff09;&#xff1a;文檔驅動的編碼與執行 AI驅動的軟件工程&#xff08;下&#xff09;&#xff1a;AI輔助的質檢與交付 大家好…

【WRFDA實操第一期】服務器中安裝 WRFPLUS 和 WRFDA

目錄在服務器上下載并解壓 WRF v4.6.1編譯 WRFDA 及相關庫安裝和配置所需庫安裝 WRFPLUS 和 WRFDA 以運行 4DVAR 數據同化一、安裝 WRFPLUS&#xff08;適用于 WRF v4.0 及以上版本&#xff09;二、安裝 WRFDA&#xff08;用于 4DVAR&#xff09;WRFDA 和 WRFPLUS 的安裝說明另…

【機器學習【6】】數據理解:數據導入、數據審查與數據可視化方法論

文章目錄一、機器學習數據導入1、 Pandas&#xff1a;機器學習數據導入的最佳選擇2、與其他方法的差異二、機器學習數據理解的系統化方法論1、數據審查方法論&#xff1a;六維數據畫像技術維度1&#xff1a;數據結構審查維度2&#xff1a;數據質量檢查維度3&#xff1a;目標變量…

AI煉丹日志-30-新發布【1T 萬億】參數量大模型!Kimi?K2開源大模型解讀與實踐

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-29 - 字節跳動 DeerFlow 深度研究框斜體樣式架 私…

如何關閉Elasticsearch的安全認證的解決方法

在Elasticsearch 中&#xff0c;啟動之后&#xff0c;需要輸入用戶名和密碼&#xff0c;才可以訪問&#xff0c;在測試環境中&#xff0c;很不方便&#xff0c;本章教程&#xff0c;主要介紹如何關閉Elasticsearch 的安全認證。在 Elasticsearch 8.x / 9.x 中&#xff0c;默認是…

day051-ansible循環、判斷與jinja2模板

文章目錄0. 老男孩思想-男女性需求差異1. 手動指定客戶機密碼2. 批量更新主機名2.1 hostname模塊2.2 添加主機清單變量2.3 編寫批量修改主機名劇本2.4 修改hosts文件2.5 分發hosts文件劇本3. ansible的并行進程數4. 分組設置主機密碼-主機清單分組變量5. 案例&#xff1a;ansib…

大模型安全建設:破誤區、識風險、筑防線20250714

&#x1f510; 大模型安全建設&#xff1a;破誤區、識風險、筑防線作者&#xff1a;Narutolxy&#xff5c;編輯時間&#xff1a;2025年7月在負責公司 AI 產品落地的過程中&#xff0c;一度以為只要選用主流開源大模型&#xff0c;前面加一層“敏感詞提示詞過濾”&#xff0c;就…

fastadmin中ajax彈窗修改文字為英文

需要把上圖的中文改為 切換語言自動切換成英文找到這個文件public/assets/js/backend.js找到如下圖部分 // //點擊包含.btn-ajax的元素時發送Ajax請求 原頁面// $(document).on(click, .btn-ajax,.ajaxit, function (e) {// var that this;// var options $.exte…

大型語言模型(LLM)的技術面試題

大型語言模型(LLM)的技術面試題 目錄 大型語言模型(LLM)的技術面試題 一、提示校準:減輕提示學習中的偏見 二、矢量存儲的適用場景 三、模型與人類價值觀對齊的技術 四、RLHF中的Reward Hacking 五、微調效果的關鍵影響因素:預訓練模型架構與大小 六、Transformer自注意力…

數字IC后端培訓教程之數字IC后端項目典型問題解析

今天給大家分享下最近幾個典型的數字后端項目案例&#xff0c;希望對大家的學習和工作有所幫助。 數字IC后端培訓教程之數字后端項目典型項目案例解析 Q1:星主&#xff0c;有啥辦法可以看到refinePlace或者ecoPlace都動到了那些inst嗎&#xff0c;log里只會有mean和max move&…

網絡(數據庫1)

常用數據庫: 1.關系型數據庫: 將復雜的數據結構簡化為二維表格形式 大型:0racle、DB2 中型:MySq1、sQLServer 小型:Sqlite 2.非關系型數據庫以鍵值對存儲,且結構不固定。//JSON Redis MongoDB數據存儲&#xff1a;變量、數組、鏈表 內存 &…

6.刪除-demo

在連接數據庫的基礎上deleteResult, err : db.Exec("DELETE FROM user0 WHERE id ?", 1)package main//刪除-demoimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql""log" )func main() {db, err : sql.Open…

人機協作系列(四)AI編程的下一個范式革命——看Factory AI如何重構軟件工程?

最近這段時間&#xff0c;我發現一個很有意思的現象&#xff1a;那些曾經對 AI 編程工具持懷疑態度的技術領袖們&#xff0c;態度正在集體轉變。就像 Flask 的作者 Armin Ronacher&#xff0c;他之前還說 “不敢授權 AI”&#xff0c;現在卻坦言 “愿意將工程主導權交給編程代理…

在javaScript里刪除節點以及添加節點

1.在javaScript里刪除節點在學習中我們只學到了一種刪除DOM節點的方法那就是通過元素的父元素來刪除該元素&#xff0c;但后面我查閱資料發現刪除節點還有其他方法。1.使用 removeChild() 方法&#xff08;最常用&#xff09;我們需要獲得元素的父元素&#xff0c;如果不知道可…

貪心算法題解——跳躍游戲【LeetCode】

55. 跳躍游戲 一、算法邏輯&#xff08;逐步思路&#xff09; 問題描述&#xff1a; 給定一個非負整數數組 nums&#xff0c;其中 nums[i] 表示從位置 i 最多可以跳躍的步數。 從起點 0 出發&#xff0c;判斷是否能夠到達最后一個位置。 解題思路&#xff1a; 設一個變量 mx…