Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法

这篇具有很好参考价值的文章主要介绍了Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法,苹果开发,客户端开发,http,网络协议,网络,tauri

接口请求处理
项目中没有使用 axios 等前端 HTTP 请求库,使用的是 Tauri 内置的 fetch 方法,但该方法使用比较简单,没有请求拦截器或响应拦截器相关配置,所以我们有必要在此基础上做下二次封装。

1. 配置安全域名 在 tauri.conf.json 里添加配置

        "allowlist": {
            "all": true,
            "http": {
                "scope": ["http://**", "https://**"]
            },
            "shell": {
                "all": false,
                "open": true
            }
        },

 红框选中的内容是必须改的,不然会发生跨域:

Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法,苹果开发,客户端开发,http,网络协议,网络,tauri

2. 封装 http 请求

新建 utils/http.ts 文件

import { fetch } from '@tauri-apps/api/http'
import qs from 'qs'

const server = ''
const baseURL = `${server}/api/v1`

const BODY_TYPE = {
    Form: 'Form',
    Json: 'Json',
    Text: 'Text',
    Bytes: 'Bytes',
}

const commonOptions = {
    timeout: 60,
}

const isAbsoluteURL = (url: string): boolean => {
    return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
}

const combineURLs = (baseURL: string, relativeURL: string): string => {
    return relativeURL
        ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '')
        : baseURL
}

const buildFullPath = (baseURL: string, requestedURL: string) => {
    if (baseURL && !isAbsoluteURL(requestedURL)) {
        return combineURLs(baseURL, requestedURL)
    }
    return requestedURL
}

const buildURL = (url: string, params: any): string => {
    if (!params) {
        return url
    }
    const serializedParams = qs.stringify(params)
    if (serializedParams) {
        url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
    }
    return url
}

const http = (url: string, options: any = {}) => {
    const params = { ...options.params }
    if (!options.headers) options.headers = {}
    // todo 可以往 headers 中添加 token 或 cookie 等信息

    if (options?.body) {
        if (options.body.type === BODY_TYPE.Form) {
            options.headers['Content-Type'] = 'multipart/form-data'
        }
    }

    options = { ...commonOptions, ...options }
    return fetch(buildURL(buildFullPath(baseURL, url), params), options)
        .then(({ status, data }) => {
            if (status >= 200 && status < 400) {
                return { data }
            }
            return Promise.reject({ status, data })
        })
        .catch((err) => {
            console.error(err)
            return Promise.reject(err)
        })
}

export default http

3.简单实用

这里要注意,发送请求前,就要知道返回的数据类型:下面三种

Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法,苹果开发,客户端开发,http,网络协议,网络,tauri不然会发生错误。

as JSON: SyntaxError: Unexpected token '<', "<!doctype "... is not valid JSON;
              try setting the `responseType` option to `ResponseType.Text` or `ResponseType.Binary` if the API does not return a JSON response.
    at chunk-YIDC66OP.js:1:1532Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法,苹果开发,客户端开发,http,网络协议,网络,tauri

 这是因为没有指定响应的数据类型,需要添加一下: responseType: http.ResponseType.Text

 文章来源地址https://www.toymoban.com/news/detail-633556.html

GET:

import http from '@/utils/http';

const params = {};

http('https://www.baidu.com/get', {
  method: 'get',
  params,
});

 POST:

import { Body } from '@tauri-apps/api/http';
import http from '@/utils/http';

const body = Body.json({
  test: '1',
});

http('https://www.baidu.com/post', {
  method: 'post',
  body,
});

POST 上传文件

import { Body } from '@tauri-apps/api/http';
import http from '@/utils/http';

const generateFileInfo = (
  arrayBuffer: any,
  mime: string,
  fileName: string,
) => {
  return {
    file: new Uint8Array(arrayBuffer),
    mime,
    fileName,
  };
};

const arrayBuffer = await file.arrayBuffer();
const body = Body.form({
  file: generateFileInfo(arrayBuffer, file.type, file.name),
  // todo 其他参数
});

http('https://www.baidu.com/upload', {
  method: 'post',
  body,
});

带数据类型的请求:

async function getData() {
    const params = {}
    const res = await http('https://www.baidu.com', {
        method: 'get',
        params,
        responseType: ResponseType.Text,
    })
    console.log('返回的数据是:', res)
}

请求到的数据:

Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法,苹果开发,客户端开发,http,网络协议,网络,tauri

 

到了这里,关于Tauri发送网络请求系列,接口请求封装并遇到的问题解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp api请求接口 封装

    2024年02月12日
    浏览(49)
  • 接口自动化测试:Requests统一请求封装(框架的封装)

    一、为什么要做统一请求封装? 1. 去除很多重复的、冗余的代码; 2.  异常处理和日志监控: 设置统一的公共参数、统一的文件处理、统一的异常处理、统一的日志监控、统一的用例断言等; 3. 跨py文件实现通过一个session自动管理有cookie关联的接口;               

    2024年01月24日
    浏览(55)
  • 封装小程序request请求[接口函数]

             在这篇小程序API的Promise化文章中讲到小程序官方提供的异步API都是基于回调函数来实现的,在大量的使用这种回调函数就会造成回调地狱的问题,以及代码的可读性和可维护性差,通过对小程序API的Promise化能解决,那么本篇是来讲进行对微信小程序网络数据请求的

    2024年02月03日
    浏览(37)
  • Vue 封装ajax请求[接口]函数

             在Vue项目开发当中,当有了后端提供的数据接口之后呢,就需要来为接口定义接口的请求函数,那么在去定义接口函数之前可以先来封装一个ajax请求函数;可能有的初学者在之前的一些篇目当中看到这个vue发起数据请求的不是使用axios的吗?这个确实没有问题,在

    2024年02月08日
    浏览(38)
  • 接口测试|postman发送POST请求

    postman发送POST请求 示例:微信公众平台创建用户标签接口,业务操作如下: 1、打开微信公众平台,微信扫码登录:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 2、打开微信开放文档,找到用户管理-用户标签管理的接口信息: https://developers.weixin.qq.com/doc/offiaccount/Basic_Inf

    2023年04月17日
    浏览(56)
  • postman接口测试之发送post请求

    目录 前言: 一、新建目录文件夹 二、新建请求(api接口)

    2024年02月11日
    浏览(59)
  • js异步请求接口\模拟异步封装

    2024年01月16日
    浏览(32)
  • vue 封装的axios接口,请求接口动态增加headers&responseType

    一、遇到一个需求,掉接口的时候,给headers中添加一个参数

    2024年02月16日
    浏览(43)
  • Python接口自动化之request请求封装

    我们在做自动化测试的时候,大家都是希望自己写的代码越简洁越好,代码重复量越少越好。那么,我们可以考虑将request的请求类型(如:Get、Post、Delect请求)都封装起来。这样,我们在编写用例的时候就可以直接进行请求了。 我们先来看一下Get、Post、Delect等请求的源码,

    2024年02月13日
    浏览(46)
  • uniapp接口请求api封装,规范化调用

    封装规范和vue中的差不多,都是统一封装成一个request对象,然后在api.js里面调用。 先创建一个utils文件夹,然后里面创建一个request.js,代码如下: 在api文件夹中封装对应的index.js文件,然后导入request对象: 在对应的vue或者react中引入并调用:

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包