调用百度翻译API遇到的跨域问题解决方案

news2024/12/23 17:59:37

🎉 前言

这几天在学习前端的时候需要写一个实例,是关于翻译功能的。于是便想着在网上找一些API看能不能调用。这里遇到一个很坑的问题,就是我在暑假学习的时候曾经调用过心知天气的API、QQ音乐的API和今日头条的API,都未曾遇到过跨域问题,但是现在找了一大堆的翻译API,全都会遇到跨域问题,看来是无法避免要解决它了。其实每个初学前端的人都遇到过这个问题,可能会觉得这个问题非常棘手,网上也没有一个统一的解决方案,一开始我也是这么觉得的,但我发现了一个可行性还是比较高的方法,在这里做一下记录和分享。

🎉 什么是跨域

我采用的方法是使用nginx正向代理解决跨域问题。简单讲一下实现原理。首先,我们知道,浏览器在处理不同域名之间的通信和请求时,会自动触发同源保护机制。对于我们自己的项目,只要在后端代码中添加一个响应头即可,但是就像我现在面临的处境,我是在调用百度翻译的API,自然不可能去修改百度的后端代码。

于是,我看了一些网上的资料,得到了一个启发:既然这是浏览器的一种保护机制,那么有没有什么方法可以先让浏览器去请求本地的服务器,本地服务器再去请求远程服务器,也就是说让本地服务器充当一个中间代理的角色,浏览器与本地服务器之间通信自然就不会存在跨域问题了。

看到这里,很多读者可能就会想到,这不就是nginx的作用吗,没错,接下来我们就要去借助nginx为我们代理请求,从而解决跨域问题。

🎉 前期准备

这里推荐使用集成工具去下载和管理nginx,我自己使用的是PhpWebStudy ,即使你之前已经下载过了nginx,我还是推荐这个工具,这个工具在管理本地各种配置方面非常有帮助。当然,如果你不想下载,也不影响后续配置,只要下载了ngixn即可,但是后续讲解会以PhpWebStudy这款软件为基础。

🎉 配置代理

打开PhpwebStudy,进入如下页面:
image
(如果没有安装nginx,先根据软件提示安装好nginx)

打开配置文件,找到http模块下的server模块开始编写配置,配置模版如下:

server {
    listen 80;
    server_name yourdomain.com;

    location /api {
        proxy_pass http://api.example.com;  # 转发请求到后端 API
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 解决跨域问题
        add_header 'Access-Control-Allow-Origin' '*';  # 允许所有来源跨域请求
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  # 允许的方法
        add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization';

        # 处理预检请求
        if ($request_method = 'OPTIONS') {
            return 204;  # 对于 OPTIONS 请求直接返回204,无内容响应
        }
    }
}

简单解释一下,这里我将location设置成了/test ,server_name配置成了localhost,proxy_pass配置成了百度翻译的API请求地址(proxy_pass就是代理的地址)http://api.fanyi.baidu.com/api/trans/vip/translate,这三项配置完成之后,重启ngixn,然后在浏览器地址栏输入localhost/test,会得到以下回复:
image
说明我们已经配置好了本地代理,具体表现在我们访问本机(localhost)地址会被nginx代理到百度翻译的api接口。

🎉代码实现

translate() {
    that = this
    let originalString = "AppId" + this.srcContent + "1435660288"+"secretKey"
    let sign = CryptoJS.MD5(originalString).toString();
    axios.get('http://127.0.0.1/test', {
        params: {
            q: this.srcContent, // 参数名 'q' 应该与百度翻译 API 匹配
            from: 'en',
            to: 'zh',
            appid: 'AppId',
            salt: '1435660288',
            sign: sign
        }
    }).then(
        function (response) {
            console.log(response.data.trans_result[0].dst);
            that.dstContent = response.data.trans_result[0].dst;
        },
        function (err) {
            console.log(err);
        }
    )
}

大家可以参考一下,AppId和secretKey替换成你们自己申请的AppId和密钥,具体参考这篇文档:百度开发者文档,由于这篇文章重点不在于此,因此不再深入。

🎉 解决重定向问题

最后在代码中实现请求的时候,在浏览器中打开总是会重定到百度翻译的网页端,而不是百度翻译的API接口,为了解决这个问题,我还思考了很久,但解决方法却比较简单,具体原理不甚清楚,就是将

proxy_set_header Host $host;

改成

proxy_set_header Host api.fanyi.baidu.com

这样就可以确保代理请求被正确识别并发送到百度翻译 API了。

OK,今天的分享就到这里,可能有些地方讲的不够清楚详细,大家可在评论区里评论,我会尽量为大家解答。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RT-DETR改进策略:BackBone改进|Swin Transformer,最强主干改进RT-DETR

摘要 在深度学习与计算机视觉领域,Swin Transformer作为一种强大的视觉Transformer架构,以其卓越的特征提取能力和自注意力机制,正逐步引领着图像识别与检测技术的革新。近期,我们成功地将Swin Transformer引入并深度整合至RT-DERT(一种高效的实时目标检测与识别框架)中…

BSV区块链上的覆盖网络服务现已开放公测

​​发表时间:2024年8月30日 BSV区块链的覆盖网络服务现已正式开放公测。对于BSV区块链生态系统内的特定交易类型和数据管理及访问,覆盖网络服务都可以为它们提供强大、可扩展、并且合规的解决方案。覆盖网络以及其它即将推出的BSV服务将赋予开发者、企业…

文件误删除?助你一键恢复

文件误删除之痛 在日常的数字生活中,文件误删除是许多用户不时会遭遇的“小确丧”。无论是手滑点击了“删除”键,还是系统崩溃导致的文件丢失,这些意外事件总能让人心急如焚。文件误删除不仅可能意味着重要资料的永久消失,还可能…

Linux驱动编程 - platform平台设备驱动总线

目录 简介: 一、初识platform平台设备驱动 1、platform_driver驱动代码框架 2、platform_device设备代码框架 3、测试结果 3.1 Makefile编译 3.2 加载驱动 二、platform框架分析 1、注册platform总线 1.1 创建platform平台总线函数调用流程 1.2 platform_b…

鸿蒙开发之ArkTS 基础三 数组

数组可以存储多个数据 语法为: let 数组名字:数组类型[] [数据一,数据二 ,数据三 ,数据四 ,数据5⃣️] 例如:学生类数组 let students:string[] [小美,小红,小张,小西] console.log("students",students) 输出 小美,小红,小张,小西 这里不需要遍历就能输出内容…

C Primer Plus 第5章习题

你该逆袭了 红色标注的是:错误的答案 蓝色标注的是:正确的答案 绿色标注的是:做题时有疑问的地方 橙色标注的是:答案中需要着重注意的地方 练习题 一、复习题1、2、3、4、错误答案:正确答案: 5、我的答案&a…

十三,Spring Boot 中注入 Servlet,Filter,Listener

十三,Spring Boot 中注入 Servlet,Filter,Listener 文章目录 十三,Spring Boot 中注入 Servlet,Filter,Listener1. 基本介绍2. 第一种方式:使用注解方式注入:Servlet,Fil…

Cobbler 搭建方法

统信服务器操作系统行业版V20-1000c【Cobbler 搭建】手册 统信服务器操作系统行业版 V20版本上Cobbler 搭建方法 文章目录 功能概述一、使用范围二、cobbler工作流程1. Server 端2. Client 端三、 环境准备1. 测试环境告知,以提供配置时参考:2. 关闭防火墙、selinux:3. 注意…

C#学习笔记(三)Visual Studio安装与使用

博主刚开始接触C#,本系列为学习记录,如有错误欢迎各位大佬指正!期待互相交流! 上一篇文章中安装了Visual Studio Code来编写调试C#程序,但是博主的目标是编写带窗口的应用程序,了解之后发现需要安装Visual …

python-素数对

题目描述 定义两个相差为 2 的素数称为素数对,如 5 和 7,17 和 19 等,要求找出所有两个数均不大于 n 的素数对。输入 一个正整数 n。1≤n≤10000。输出 所有小于等于 n 的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数…

VS2019配置TIFF

1.下载 Index of /libtiff/ (osgeo.org) 2.配置 3.使用 4.测试程序 #include <iostream> #include <cstdint> // 包含 stdint.h 头文件 #include "tiffio.h"int main() {std::cout << "Hello World!\n";// 打开一个 TIFF 文件const ch…

06_Python数据类型_元组

Python的基础数据类型 数值类型&#xff1a;整数、浮点数、复数、布尔字符串容器类型&#xff1a;列表、元祖、字典、集合 元组 元组&#xff08;Tuple&#xff09;是一种不可变的序列类型&#xff0c;与列表类似&#xff0c;但有一些关键的区别。本质&#xff1a;只读的列表…

java程序崩了不会看怎么办,那就用jconsole试试

性能监控工具 jconsole JConsole工具是JDK自带的图形化性能监控工具。并通过JConsole工具&#xff0c; 可以查看Java应用程序的运行概况&#xff0c; 监控堆信息、 元空间使用情况及类的加载情况等。 JConsole程序在%JAVA_HOM E%/bin目录下 或者你可以直接在命令行对他进行…

排序算法-交换排序

目录 基本思想 一、冒泡排序 二、快速排序分析 1. hoare版本 2. 挖坑法 3. 前后指针版本 4. 快速排序的优化 三、代码示例 1. hoare版本 2. 挖坑法 3. 前后指针版本 四、快速排序&#xff08;三路划分) 五、总结 基本思想 基本思想&#xff1a;所谓交换&#xff0…

VS Code终端命令执行后老是出现 __vsc_prompt_cmd_original: command not found

VS Code终端命令执行后老是出现 __vsc_prompt_cmd_original: command not found。 如下图&#xff08;vscode终端中&#xff09;&#xff1a; 解决方案&#xff1a; 1、vim ~/.bashrc 2、在~/.bashrc里面加入命令&#xff1a;unset PROMPT_COMMAND 3、source ~/.bashrc

【AI大模型】Kimi API大模型接口实现

一、Kimi大模型概述 Kimi&#xff0c;月之暗面旗下国产大模型。是北京月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;于2023年10月9日推出的一款智能助手&#xff0c;主要应用场景为专业学术论文的翻译和理解、辅助分析法律问题、快速理解API开发文档等&#xff0c…

关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求

一、关于http的206状态码和416状态码的意义及断点续传 HTTP 2xx范围内的状态码表明客户端发送的请求已经被服务器接受并且被成功处理了,HTTP/1.1 206状态码表示客户端通过发送范围请求头Range抓取到了资源的部分数据&#xff0c;一般用来解决大文件下载问题&#xff0c;一般CDN…

直接的强化学习与间接的强化学习

强化学习是一种机器学习方法&#xff0c;用于让智能体在与环境的交互中学习最优策略&#xff0c;以获得最大的奖励。根据强化学习的方式&#xff0c;可以分为直接强化学习和间接强化学习。直接强化学习注重直接从奖励信号中学习最优策略&#xff0c;而间接强化学习则通过学习环…

【吊打面试官系列-MySQL面试题】MySQL 中有哪几种锁?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL 中有哪几种锁&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL 中有哪几种锁&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1、表级锁&#xff1a;开销小&#xff0c;加锁快&…

2024.9.16 day 1 pytorch安装及环境配置

一、配置pytorch环境&#xff0c;安装pytorch 1.查看python版本 python --version 2.在anaconda命令中创建pytorch环境 conda create -n pytorch python3.12(python版本&#xff09; 3.pytorch安装 pytorch首页 PyTorchhttps://pytorch.org/ os为windows推荐package选择…