jQuery发送DELETE请求的参数无法被CherryPy后端接收的问题求助
解决jQuery DELETE/POST请求参数无法被CherryPy后端获取的问题
问题原因
- CherryPy默认解析规则:CherryPy默认仅自动解析
POST请求(且内容类型为application/x-www-form-urlencoded)的表单数据,对于DELETE请求,默认不会主动解析请求体中的参数。 - jQuery方法差异:
$.post默认会把data编码为application/x-www-form-urlencoded格式发送,但手动用$.ajax指定type: 'POST'或'DELETE'时,若未显式设置contentType,数据编码方式可能不符合CherryPy的自动解析要求,导致参数无法提取。
解决方案
方案1:将参数放到URL查询字符串(最简单通用)
不管请求方法是DELETE还是POST,直接把参数拼接在URL后,CherryPy的方法参数可直接获取:
$.ajax({ url: `/rest/order?magentoid=${order_id}`, type: 'DELETE', success: function(data) {}, error: function(xhr, status, error) {} });
方案2:前端显式设置contentType,后端开启解析工具
前端修改:
确保$.ajax发送的请求内容类型为application/x-www-form-urlencoded,让jQuery正确编码数据:
$.ajax({ url: `/rest/order`, type: 'DELETE', data: { "magentoid": order_id }, contentType: 'application/x-www-form-urlencoded; charset=UTF-8', processData: true, // 默认开启,确保数据编码为表单格式 success: function(data) {}, error: function(xhr, status, error) {} });
后端修改:
给接口添加cherrypy.tools.request_body()工具,让CherryPy解析DELETE请求的表单数据:
@cherrypy.expose @cherrypy.tools.json_out() @cherrypy.tools.request_body() def order(self, supplier = None, magentoid = None, dropship = None): logging.info(f"supplier: {supplier}, magid: {magentoid}")
方案3:后端手动解析请求体
如果需要用JSON格式传参,可手动读取并解析请求体:
前端修改(发送JSON):
$.ajax({ url: `/rest/order`, type: 'DELETE', data: JSON.stringify({ "magentoid": order_id }), contentType: 'application/json', success: function(data) {}, error: function(xhr, status, error) {} });
后端修改:
import json @cherrypy.expose @cherrypy.tools.json_out() def order(self): # 读取并解析请求体 body = cherrypy.request.body.read().decode('utf-8') params = json.loads(body) if body else {} magentoid = params.get('magentoid') supplier = params.get('supplier') dropship = params.get('dropship') logging.info(f"supplier: {supplier}, magid: {magentoid}")
补充说明
你提到用$.ajax改POST也拿不到参数,大概率是未显式设置contentType导致编码方式错误,按方案2的前端配置修改即可解决。
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

