【问题标题】:Ajax POST not reaching server, returning 400 only in FirefoxAjax POST 未到达服务器,仅在 Firefox 中返回 400
【发布时间】:2019-05-29 20:59:46
【问题描述】:

我有一个在 Apache 中运行的 Flask 服务器,它返回一个带有按钮的 HTML 页面,用于向相对 URL 提交 AJAX POST 请求。在 Firefox 中,AJAX 调用立即失败并返回 400,记录 POST response ERROR code: 400。将 xhr 对象数据参数记录到控制台会生成<unavailable>,其responseText 属性为undefined。无论将什么 URL 传递给 AJAX,响应都是完全相同的。绝对 URL (http://thehostname.com/path/send-email) 也给出相同的结果。

Apache 的access.log 显示在 AJAX 请求时没有请求进入。该请求根本不会出现在开发工具的 Firefox 的“网络”选项卡中。该请求在 Chrome 中运行良好,所有其他条件都相同,cURL 也是如此。

代码如下。请帮忙!

HTML:

<img width="20px" src="mail.png" alt="" onerror="this.style.display='none'" onclick="sendEmail('val1', 'val2', 'val3')">

JS:

    function sendEmail(val1, val2, val3) {
        val1 = prompt('Prompt2 for ' + val2 + ':', val1);
        console.log('Val1: '+ val1);
        if(val1) {
            let xhr = $.ajax({
                method: 'POST',
                url: 'send-email',
                // Tried with and without stringify
                data: JSON.stringify({param1: val1, param2: val2, param3: val3}),
                contentType: "application/json; charset=utf-8",
                dataType: 'text',
                cache: false,
                traditional: true
            }).done(function(){
                alert("Sent!");
            }).fail(function(data){
                console.log("Info:");
                console.log(xhr.responseText);
                alert('Failed to send');
            });
        }
        console.log("Ret false");
        return false;
    };

Python 端点:

@app.route('/autorack_testing_report/send-email', methods=['POST'])
@app.route('/send-email', methods=['POST'])
def send_email():
    print("Send email") # Not getting printed
    info = request.form or request.json
    if not (info and info.get('param1') and info.get('param2')):
        abort(400, 'Must supply recipient and ticket')
    send_to_list = re.split(',|;', info['param1'])
    send_to = []
    for s in send_to_list:
        if s.strip():
            send_to.append(s.strip() + '@domain.com')
    send_to = ','.join(send_to)
    ticket = info['ticket']
    smtp = smtplib.SMTP('mysmtphost', 25)
    msg = MIMEMultipart('alternative')
    msg['Subject'] = 'subject'
    msg['From'] = msg['To'] = send_to
    msg.attach(MIMEText('somecontent', 'plain'))
    smtp.sendmail(send_to, send_to, msg.as_string())
    smtp.quit()
    resp = make_response('Success', 200)
    resp.headers['Content-Type'] = 'text/plain'
    return resp

Firefox 控制台输出:

Val1: myinput
Ret false
POST response ERROR code: 400
POST response ERROR code: 400
Info:
undefined

没有 Python 输出,因为 Apache 没有收到请求。

【问题讨论】:

  • 代码 400 表示请求错误。所以你在服务器端有无效的语法。
  • 请添加处理ajax请求的函数。 python代码。
  • 如果尝试使用 curl 访问相同的 URL 会发生什么?
  • 您最好检查一下您是在使用本地文件还是在服务器上 - 检查 Firefox URI 是否与其他浏览器上的相同。从 Chrome 复制到 Firefox。
  • @ASSILITaher 因为 Apache 的访问日志没有显示任何传入的请求,如果 Python 代码无论如何都没有被访问,是否有任何用处?如果它有帮助,我会添加它,但请求似乎没有到达服务器

标签: javascript jquery ajax apache firefox


【解决方案1】:

400 Bad Request 响应状态代码表示服务器无法或不会处理请求,因为某些原因被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性请求路由)。 'send-email' 指向哪里?

【讨论】:

  • 它指向 apache 后面的一个 Flask 端点,但无论提供什么 URL,响应都是完全相同的 - Apache 甚至没有收到请求。
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
相关资源
最近更新 更多