vue请求百度日历api以及跨域问题解决

示例链接:https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?tn=wisetpl&format=json&resource_id=39043&query=2022%E5%B9%B45%E6%9C%88&t=1650007952471&cb=op_aladdin_callback1650007952471

url:https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php

params:
query: 2022年5月 (要查询的月份,必传)
resource_id: 39043(资源ID,必传)
t: 1650005331470(时间戳,axios可以不传)
format: json (返回值格式,可以不传)
tn: wisetpl(提交搜索请求来源,必传)
cb: op_aladdin_callback1650005331470 (跨域jsonp用的,axios等不传)

method: ‘get’

return:

{
  "animal": "虎",// 生肖
  "avoid": "开业.入宅.开工.开张.开市",// 忌
  "cnDay": "日",// 星期
  "day": "8",// 日
  "gzDate": "辛酉",// 天干地支日
  "gzMonth": "乙巳",// 天干地支月
  "gzYear": "壬寅",// 天干地支年
  "isBigMonth": "",// 是否大月 空 大月 1 小月
  "lDate": "初八",// 农历日文字
  "lMonth": "四",// 农历月文字
  "lunarDate": "8",// 农历日
  "lunarMonth": "4",// 农历月
  "lunarYear": "2022",// 农历年
  "month": "5",// 月份
  "oDate": "2022-05-07T16:00:00.000Z",// 日期
  "suit": "结婚.领证.安葬.破土.祈福.祭祀.嫁娶.斋醮.治病",// 宜
  "term": "母亲节",// 节日,展示到日历上
  "type": "i",// 现在找到了a,t,h,i 4个类型+还可能没这个字段,具体干啥不知道
  "value": "世界微笑日 世界红十字日",// 其他节日
  "year": "2022",// 年份
  "status": "" // 2 班 1休 没这个字段就正常执行作息天
},

需要注意的是,这个会连带着返回你想查询的那个月的前后两个月信息,比如你查询2022年5月,会返回2022年3月到5月所有信息。

vue访问百度日历api方法

  1. 使用axios访问:

到vue.config.js里配一下:

devServer: {
    proxy: {
    '/thirdApi': {
        target: 'https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php',
        changeOrigin: true,
        pathRewrite: {
          '^/thirdApi': ''
        }
      },
    }
 }

用于解决跨域问题。

再在对应的vue页面里:

import axios from 'axios'
getCalendar (selectDate) {
      axios.get('/thirdApi?tn=wisetpl&format=json&resource_id=39043&query=' +
      this.getYearMonth(selectDate) + '&t=' + new Date().getTime())
        .then(res => {
          console.log(res)
          this.calendarData = res.data.data[0].almanac
          this.calendarData.forEach(item => {
            item.oDate = this.getStandardDay(new Date(item.oDate))
          })
          const data = this.calendarData[0].oDate
          console.log(data)
        })
    },
    // 年月
    getYearMonth (date) {
      var y = date.getFullYear()
      var m = date.getMonth() + 1
      return y + '年' + m + '月'
    },
    // 年月日
    getStandardDay (date) {
      var y = date.getFullYear()
      var m = date.getMonth() + 1
      m = m < 10 ? ('0' + m) : m
      var d = date.getDate()
      d = d < 10 ? ('0' + d) : d
      return y + '-' + m + '-' + d
    },

我猜你应该用了el-calendar了所以顺带给需要比对的值做了格式化了~

2022-05-19更新

  1. jsonp访问:

上述1.只能测试阶段有用,但是上线会出现问题,引入vue-jsonp解决跨域问题。
2.1 首先是引入vue-jsonp

npm install vue-jsonp --save

main.js
import { VueJsonp } from 'vue-jsonp'
Vue.use(VueJsonp)

2.2 使用方法:

const url = 'https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php'
      // url = url + '?tn=wisetpl&format=jsonp&resource_id=39043&query=' + this.getYearMonth(date) + '&t=' + new Date().getTime() + '&cb=op_aladdin_callback1650007952471'
      console.log(url)
      this.$jsonp(url, {
        tn: 'wisetpl',
        format: 'json',
        resource_id: '39043',
        query: this.getYearMonth(date),
        t: new Date().getTime(),
        callbackQuery: 'cb',
        callbackName: 'jsonp_func'
      }).then(res => {
          console.log(res)
      })

这里的cb对应上面参数列表里那个cb,具体看一下vue-jsonp的文档(https://www.npmjs.com/package/vue-jsonp)

2022-05-30补充,上述方法会间歇性失败,解决方案是在callbackName内添加时间戳:格式如下:

var sec = new Date().getTime()
      const url = 'https://sp1.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php'
      this.$jsonp(url, {
        tn: 'wisetpl',
        format: 'json',
        resource_id: '39043',
        query: this.getYearMonth(date),
        t: sec,
        callbackQuery: 'cb',
        callbackName: 'op_aladdin_callback' + sec
      }).then(res => {

另,el-calendar在我实施过程中会发生点击灰色日期(也就是上个月或者下个月的日期)的时候,有时候会多跳一个月,原以为是因为我查询条件绑定的值和calendar绑定的值用了同一个的原因,去掉calendar的 v-model=""就好了,但实际去掉还是会出现问题,留存后期解决。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot和Vue前后端分离的项目中,当前端Vue通过ajax或axios请求后端的API时,会经常遇到跨域问题。 跨域是由于同源策略(Same Origin Policy)导致的,即浏览器限制了在不同源之间进行通信(不同源指协议、域名、端口号任意一个不同)。解决跨域问题的方法有很多,这里介绍一种常见的处理方式。 在Spring Boot后端配置中,我们可以通过添加一个跨域配置类来实现对请求跨域的处理。首先创建一个类,命名为CorsConfig(跨域配置类名可自定义),并在该类上加上@Configuration注解。然后在类中添加一个方法addCorsMappings,使用@CrossOrigin注解配置允许跨域的规则。例如可以设置允许所有来源(origin)、所有方法(methods)和所有请求头部(allowedHeaders),如下所示: @Configuration public class CorsConfig { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("*") .allowedHeaders("*"); } }; } } 这样就实现了对所有请求的跨域访问授权。在allowedOrigins方法中可配置指定的允许来源,如指定某个特定的域名;allowedMethods方法可配置允许的请求方法,如GET、POST等;allowedHeaders方法可配置允许携带的请求头信息。 在Vue前端项目中,可以在开发环境中通过配置代理实现请求转发来解决跨域问题。在vue.config.js(Vue的配置文件)中,添加以下代码: module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:8080', // 后端API地址 ws: true, changeOrigin: true } } } } 以上代码表示将以/api开头的请求转发到http://localhost:8080地址,并开启WebSocket和改变请求的源地址。这样前端项目就可以通过/api访问后端API,而不用担心跨域问题。 这样,我们就能够很方便地解决Spring Boot和Vue前后端分离项目中的请求API跨域问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值