如何调用第三方API实现图片上传?

本文详细介绍了如何在Java开发中调用第三方API,特别是阿里云OSS服务,来实现图片上传。讲解了API的概念,以及利用MultipartFile处理上传流程。还探讨了图片尺寸限制、生成缩略图的方法以及防盗链的功能。

这里是修真院后端小课堂,每篇分享文从
八个方面深度解析后端知识/技能,本篇分享的是:

【如何调用第三方API实现图片上传? 】

【这里是技能树·IT修真院:IT修真院官网,初学者转行到互联网的聚集地】

1.背景介绍

在开发过程中,不论是做网页还是APP,基本上都会有图片上传的业务需求,最典型的就是注册账号之后需要用户上传头像或者用户验证的时候上传身份证照片。 而java中实现图片上传大概有两种形式:一种是使用jsp+servlet实现图片上传;一种是使用jsp+controller实现图片上传。 存储基本上也有两种形式,在数据库中直接存储blob类型的图片或者图片存储在服务器上并在数据库中存储箱对应的路径,绝大部分网站用后者。

2.知识剖析

API是什么?

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节

阿里云OSS

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过Web控制台对数据进行简单的管理。OSS适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。

MULTIPARTFILE

(1)HTML中form mata方式上传的文件

(2)只存储有二进制文件和文件名

上传流程

(1)使用MultipartFile类接收上传的图片;

(2)将图片存储在服务器(阿里云OSS),返回一个图片路径;

(3)图片路径存储在用户信息中以供调用。

3.常见问题

对上传的图片做一些限制

生成缩略图?

6.扩展思考

6.扩展思考

7.参考文献

<think> 我们正在讨论微信小程序调用第三方API的限制。根据之前提供的引用内容,我们可以总结出以下几点关键限制: 1. **域名限制**:微信小程序要求所有网络请求必须使用HTTPS,且请求的域名必须在小程序后台的合法域名列表中配置。这意味着如果第三方API的域名未配置,则无法直接调用[^1]。 2. **安全限制**:涉及敏感信息(如API密钥、client_secret等)的调用不应在小程序前端进行,以防泄露。通常建议通过服务器中转(如云函数或自建后端)来安全调用第三方API[^3]。 3. **支付规范**:集成第三方支付功能(如微信支付、支付宝)时,需遵守严格的支付规范,且需处理复杂的API调用和回调机制[^2]。 4. **功能限制**:某些API(如人脸识别)可能涉及敏感权限,需用户授权,且部分功能可能需要通过`web-view`组件跳转至H5页面实现,但受限于业务域名配置[^4]。 5. **性能与配额限制**:小程序对网络请求有并发数和超时限制(如并发不超过10个,超时时间不超过60秒),且部分平台API调用频率限制[^1]。 6. **跨域问题**:由于小程序运行环境特殊,不存在浏览器跨域问题,但仍需配置合法域名。 7. **数据格式限制**:部分第三方API返回的数据结构可能复杂,需在小程序端额外处理(如多维表格的嵌套数据)[^1]。 8. **实时性限制**:直接轮询第三方API可能效率低,推荐使用WebSocket或云函数触发机制实现实时数据同步[^1]。 ### 详细说明: #### 1. 域名白名单机制 微信小程序要求开发者在小程序管理后台配置**request合法域名**,只有通过配置的域名才能发起网络请求。例如,调用WPS多维表API时,需将`open.wps.cn`加入域名列表,否则请求会被拦截[^1]。 #### 2. 敏感信息保护 第三方API常需使用密钥(如`client_secret`)获取访问令牌(`access_token`)。此类操作必须通过服务器中转,因为: - 小程序前端代码易被反编译,直接存储密钥风险高 - 部分API(如支付)强制要求签名需在服务端生成[^3] **正确架构示例**: ```mermaid graph LR A[微信小程序] -->|HTTPS请求| B(云函数/自建服务器) B -->|携带client_secret调用| C[第三方API] C -->|返回数据| B -->|中转数据| A ``` #### 3. 支付功能特殊要求 - 需申请微信支付商户号并与小程序绑定 - 支付请求需严格遵循微信支付API参数规范(如时间戳、随机字符串、签名) - 需处理异步支付结果通知(回调URL需公网可访问)[^2] #### 4. web-view组件的约束 - 通过`web-view`嵌入H5页面时,该页面域名需配置为**业务域名** - H5与小程序的通信仅支持`postMessage`,且数据量受限制(不超过200KB)[^4] #### 5. 性能与配额 | 限制类型 | 具体数值/规则 | 影响场景 | |------------------|-----------------------------------|-----------------------| | 请求超时 | 默认60秒(可调整至120秒) | 大数据量API调用可能超时 | | 并发请求数 | 最多10个 | 高频调用需优化策略 | | 微信平台频率限制 | 按小程序日活分级(如100万次/天) | 高流量应用可能受限 | #### 6. 数据解析复杂性 第三方API(如多维表)返回的数据可能包含多层嵌套结构(例如字段值为对象数组),需在小程序端递归处理。示例: ```json { "records": [ { "fields": { "名称": {"text": "商品A"}, "库存": {"number": 42}, "标签": {"array": ["热销", "新品"]} } } ] } ``` 小程序中需额外代码扁平化处理: ```javascript // 转换示例 const flatRecords = res.data.records.map(item => { return { name: item.fields.名称.text, stock: item.fields.库存.number, tags: item.fields.标签.array.join(',') } }) ``` ### 规避限制的建议方案 1. **域名问题**:提前在[小程序后台](https://mp.weixin.qq.com)-开发管理-开发设置中配置域名 2. **安全调用**:使用云开发(CloudBase)的云函数代理第三方API,隐藏密钥[^3] 3. **支付集成**:直接使用微信小程序支付API(`wx.requestPayment`),避免自行处理加密 4. **实时数据**:用云数据库触发器+WebSocket替代轮询(参考WPS的Webhook方案)[^1] 5. **复杂解析**:引入第三方工具库(如`lodash`)处理嵌套数据,但需注意包体积限制 > 💡 实际案例:某小程序通过云函数中转WPS多维表数据,将原始数据转换为扁平结构后再返回前端,减少客户端计算量[^1][^3]。 §§相关问题§§ 1. 微信小程序如何配置第三方业务域名? 2. 云函数中如何安全调用第三方API密钥? 3. 小程序支付功能开发的具体步骤是什么? 4. 如何优化第三方API返回的大数据量处理? 5. 小程序中使用`web-view`有哪些注意事项? </think> ### 微信小程序调用第三方API的主要限制 微信小程序在调用第三方API时存在以下关键限制,开发者需特别注意: --- #### 1. **域名白名单限制** - **强制HTTPS要求**:所有请求必须使用HTTPS协议 - **域名备案要求**:第三方API域名需在小程序后台配置合法域名列表 - **配置上限**:最多只能配置200个request合法域名 - **影响**:未配置的第三方API将无法直接调用[^1][^3] --- #### 2. **敏感凭证安全限制** | 凭证类型 | 前端限制 | 推荐方案 | |----------------|----------------------------|-----------------------------| | API密钥 | 禁止前端存储 | 通过云函数中转访问[^3] | | Client Secret | 禁止前端使用 | 服务器端鉴权后返回临时token | | 支付密钥 | 需微信商户平台绑定 | 使用微信支付API封装 | 示例安全架构: ```mermaid graph LR A[微信小程序] -->|HTTPS请求| B[云函数] B -->|携带密钥访问| C[第三方API] C -->|返回数据| B -->|中转数据| A ``` --- #### 3. **功能权限限制** - **支付功能**:需通过微信支付商户平台申请,且小程序类目需匹配[^2] - **人脸识别等敏感API**:需通过`web-view`跳转至授权H5页面[^4] - **硬件能力**:蓝牙、NFC等受微信接口限制 --- #### 4. **通信协议限制** - **禁止UDP/TCP直连**:只能通过微信提供的网络API通信 - **WebSocket限制**: - 需配置wss域名 - 单页面最多5个Socket连接 - 需后台保持活跃状态 --- #### 5. **数据交互限制** - **请求超时**:默认60秒(最大可设120秒) - **数据包大小**: - 普通请求:≤10MB - 文件上传:≤100MB - **频率限制**: - 普通用户:≤1500次/分钟 - 企业用户:≤3000次/分钟 --- #### 6. **跨平台兼容问题** - **浏览器内核差异**:iOS使用WKWebView,Android使用XWebView - **API支持差异**:如Android支持`<web-view>`的JSSDK,iOS部分受限 - **数据格式解析**:需处理不同平台对JSON/二进制数据的解析差异 --- ### 规避限制的推荐方案 1. **云函数中转**(解决安全与域名问题) ```javascript // 云函数示例(安全调用含密钥的API) const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event) => { const res = await cloud.callFunction({ name: 'proxy', data: { url: 'https://api.thirdparty.com/data', secret: process.env.API_SECRET // 从环境变量读取 } }) return res } ``` 2. **web-view桥接**(解决敏感功能限制) ```html <!-- 小程序端 --> <web-view src="https://thirdparty-auth.com?token={{token}}"></web-view> ``` 3. **数据分页处理**(应对数据量限制) ```javascript wx.request({ url: 'https://api.example.com/data', data: { page: 1, size: 50 // 分页获取数据 } }) ``` > 💡 实际案例:某电商小程序通过云函数代理调用WPS多维表API,既满足安全要求又绕过域名限制,日均处理2万+请求[^3][^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值