使用bit.ly缩短含JSON参数的URL时出现二次编码问题求助
解决node-bitly短链接二次编码导致跳转失败的问题
问题根源
URLSearchParams处理JSON字符串参数时会自动编码,而node-bitly 7.1.2的shorten()方法会对传入的整个URL再次执行编码,导致JSON参数被二次转义(例如"被转成%22后又被转成%2522),最终跳转时酒店可用率引擎无法解析参数。
方案1:手动预编码JSON参数后构建URL
先对JSON字符串单独编码,再传入URLSearchParams,避免重复编码:
const { URLSearchParams } = require('url'); const BitlyClient = require('bitly').BitlyClient; const bitly = new BitlyClient('YOUR_BITLY_ACCESS_TOKEN'); // 定义酒店可用率参数 const availabilityParams = { hotelId: 'HOTEL_1001', checkIn: '2024-06-10', checkOut: '2024-06-15', rooms: 2 }; // 手动编码JSON字符串 const encodedJsonParam = encodeURIComponent(JSON.stringify(availabilityParams)); // 构建URL时直接使用预编码的参数 const searchParams = new URLSearchParams(); searchParams.append('availability', encodedJsonParam); const targetUrl = `https://your-hotel-engine.com/check?${searchParams.toString()}`; // 调用bitly缩短URL async function generateShortLink() { try { const response = await bitly.shorten(targetUrl); console.log('有效短链接:', response.link); } catch (error) { console.error('缩短失败:', error.message); } } generateShortLink();
方案2:直接拼接URL字符串(绕过URLSearchParams)
手动构造完整查询字符串,确保JSON参数仅被编码一次:
const BitlyClient = require('bitly').BitlyClient; const bitly = new BitlyClient('YOUR_BITLY_ACCESS_TOKEN'); // 定义参数并手动编码 const availabilityParams = { hotelId: 'HOTEL_1001', checkIn: '2024-06-10', checkOut: '2024-06-15', rooms: 2 }; const queryParam = `availability=${encodeURIComponent(JSON.stringify(availabilityParams))}`; const targetUrl = `https://your-hotel-engine.com/check?${queryParam}`; // 生成短链接 async function generateShortLink() { try { const response = await bitly.shorten(targetUrl); console.log('有效短链接:', response.link); } catch (error) { console.error('缩短失败:', error.message); } } generateShortLink();
方案3:临时修正已生成的错误短链接(应急方案)
如果已生成错误短链接,可通过bitly的expand()接口获取跳转目标,修正编码后重新生成:
const BitlyClient = require('bitly').BitlyClient; const bitly = new BitlyClient('YOUR_BITLY_ACCESS_TOKEN'); const { URL } = require('url'); async function fixBrokenShortLink(shortLink) { try { // 获取短链接对应的原始长链接 const expandResult = await bitly.expand(shortLink); const brokenLongUrl = expandResult.expand[0].long_url; // 解析并修正参数编码 const urlObj = new URL(brokenLongUrl); const decodedParam = decodeURIComponent(urlObj.searchParams.get('availability')); urlObj.searchParams.set('availability', encodeURIComponent(decodedParam)); const correctedLongUrl = urlObj.toString(); // 重新生成正确的短链接 const fixedShortLink = await bitly.shorten(correctedLongUrl); console.log('修正后的短链接:', fixedShortLink.link); } catch (error) { console.error('修正失败:', error.message); } } // 调用示例:传入错误的短链接 fixBrokenShortLink('https://bit.ly/3Xz1234');
内容的提问来源于stack exchange,提问作者Leo Lozes
相关产品推荐
相关产品推荐

