在 React Native 中调用原生网络请求,可以通过内置 API、第三方库或自定义原生模块实现。 一、使用 React Native 内置 API 1.Fetch API
React Native 内置了符合 Web 标准的 Fetch API,支持 GET/POST 请求及异步处理,是官方推荐的基础方案。
基本用法:
// GET 请求 fetch('https://api.example.com/data') .then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error('Error:', error)); // POST 请求(JSON 格式) fetch('https://api.example.com/endpoint', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ key: 'value' }), });流式文本支持:通过
response.text()处理大文本或流式数据 。
适用于需要更底层控制的场景(如进度监控),但语法较复杂:
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data');
xhr.onreadystatechange = () => {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log(xhr.responseText);
}
};
xhr.send();优势:支持二进制数据(如
ArrayBuffer)和上传进度监控 。
提供更简洁的 API 和拦截器功能,需额外安装:
import axios from 'axios';
axios.get('https://api.example.com/data')
.then(response => console.log(response.data))
.catch(error => console.error(error));
// 全局配置示例
axios.defaults.baseURL = 'https://api.example.com';
axios.interceptors.request.use(config => {
config.headers.Authorization = 'Bearer token';
return config;
});适用场景:复杂请求逻辑(如统一错误处理、请求重试)。
专为 React Native 优化的 Fetch 替代库,直接调用原生 Networking API,支持文本流式处理:
import { fetch } from 'react-native-fetch-api';
// 流式读取响应
fetch('https://stream.example.com')
.then(response => {
const reader = response.body.getReader();
reader.read().then(({ value }) => console.log(value));
});性能优势:绕过 XMLHttpRequest,减少桥接开销 。
当需要复用原生网络库(如 OkHttp/NSURLSession)或处理加密通信时,可通过以下步骤实现:
1.Android 原生模块
// MyNetModule.java
public class MyNetModule extends ReactContextBaseJavaModule {
public MyNetModule(ReactApplicationContext context) { super(context); }
@Override
public String getName() { return "MyNetModule"; }
@ReactMethod
public void nativeGet(String url, Promise promise) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
promise.resolve(response.body().string());
}
// 错误处理省略
});
}
}
// 注册到 Package
public class MyPackage implements ReactPackage {
@Override
public List createNativeModules(...) {
return Arrays.asList(new MyNetModule(reactContext));
}
}JavaScript 调用:
import { NativeModules } from 'react-native';
NativeModules.MyNetModule.nativeGet('https://api.example.com/data')
.then(data => console.log(data));2.iOS 原生模块// MyNetModule.m
RCT_EXPORT_METHOD(nativeGet:(NSString *)url resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:url] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) { reject(@"error", @"Request failed", error); }
else { resolve([[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }
}] resume];
}四、安全与配置HTTPS 强制要求:
iOS:需在
Info.plist中添加 ATS 例外(仅限开发阶段)。Android 9+:在
AndroidManifest.xml中设置android:usesCleartextTraffic="true"允许 HTTP 。
证书绑定:在原生层实现 SSL Pinning,增强安全性 。
五、性能优化建议
方法
适用场景
优势
缺点
Fetch API
简单请求、快速原型开发
内置、无需额外依赖
功能较基础
Axios
复杂逻辑、统一配置
拦截器、自动 JSON 转换
增加包体积
原生模块
高性能需求、复用现有原生代码
极致性能、完全控制
开发成本高、维护复杂
react-native-fetch-api
流式文本处理
原生 Networking API 集成
社区资源较少
实践步骤推荐
优先使用 Fetch/Axios:满足 90% 的网络请求需求。
按需引入原生模块:仅在需要复用原生代码或处理特殊协议(如 WebSocket 加密)时使用。
监控与调试:通过 Flipper 或 Reactotron 分析网络性能,优化请求频率与数据量 。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.