假设后台 controller 的参数是一个 User 类型的变量,User 的定义如下:
public class User {String name;Map<string, Object> params;
}
前台的 json 要使用以下写法:
{name: '22','params[age]': '21','params[weight]': 60
}
如果后台报错说请求链接包含非法字符,则用 encodeURIComponent 编码,或者直接手动写死也行,'[' 是 '%5B', ']' 是 '%5D'。
如果前端使用的是 Vue,那么可以在 request 拦截器里统一处理。既然要处理,那么前端就改用一种更符合直觉的方式:
{name: '22',params: {age: '21',weight: 60}
}
然后在 request 拦截器里做转换和编码:
service.interceptors.request.use(config => {const isToken = (config.headers || {}).isToken === falseif (getToken() && !isToken) {config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改}let url = config.url;if (config.method === 'get' && config.params) {url += '?';let keys = Object.keys(config.params);for (const key of keys) {const value = config.params[key];if (typeof value === 'object') {for (const key2 of Object.keys(value)) {let key3 = key + '[' + key2 + ']';url += `${encodeURIComponent(key3)}=${value[key2] == undefined ? '' : encodeURIComponent(value[key2])}&`;}} else {url += `${encodeURIComponent(key)}=${config.params[key] == undefined ? '' : encodeURIComponent(config.params[key])}&`;}}url = url.substring(0, url.length - 1);config.params = {};}config.url = url;return config
}, error => {console.log(error)Promise.reject(error)
})