最近在做一个基于Java的在线翻译系统,这个项目让我对前后端交互和第三方API调用有了更深入的理解。整个系统采用Spring Boot+Vue.js架构,前端负责语言选择和内容展示,后端处理翻译请求并调用百度翻译API。下面我会详细分享整个开发过程中的技术选型、实现细节和踩过的坑。
选择Spring Boot作为后端框架主要考虑以下几点:
前端选择Vue.js是因为:
采用典型的三层架构:
与百度翻译API的交互通过HTTP协议完成,考虑到翻译内容可能较长,实现了GET和POST两种请求方式自动切换。
百度翻译API的集成是关键部分,主要流程如下:
java复制public String getTransResult(String query, String from, String to) throws IOException {
Map<String, String> params = buildParams(query, from, to);
JSONObject jsonObject = null;
// 自动选择请求方式
if (query.length() >= 2000){
jsonObject = HttpUtil.doPostStr(TRANS_API_HOST, params);
}else {
String url = getUrlWithQueryString(TRANS_API_HOST, params);
jsonObject = HttpUtil.doGetStr(url);
}
// 错误处理
if (jsonObject.get("error_code")!=null) {
return "翻译失败,原因:"+jsonObject.get("error_msg");
}else{
return JSON.toJSONString(
JSON.parseObject(jsonObject.toString(), TransResult.class)
);
}
}
语言数据存储在MySQL的t_lang表中,包含两个关键字段:
前端通过axios获取语言列表:
javascript复制getLang(){
axios.get('http://localhost:8080/lang/all')
.then(res=>{
this.langs = res.data.data
})
.catch(error=>{
console.log('发生未知错误!'+error)
})
}
问题:频繁刷新页面导致多次查询数据库
解决方案:
问题:Vue.js前端与Spring Boot后端跨域请求失败
解决方案:
java复制@RestController
@RequestMapping("/lang")
@CrossOrigin // 解决跨域问题
public class LangController {
// ...
}
问题:GET请求对长文本有限制
解决方案:
application.yml关键配置:
yaml复制spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/translate-api?useUnicode=true&characterEncoding=utf8
username: root
password: root
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
设计测试用例验证核心功能:
测试结果截图显示各功能模块运行正常,响应时间在可接受范围内。
通过这个项目,我掌握了:
后续计划深入研究:
这个项目虽然基础,但涵盖了Web开发的完整流程。在实际开发中,最大的体会是:文档阅读和错误排查能力往往比编码本身更重要。比如百度API的签名机制,必须严格按照文档实现每个细节才能成功调用。