jQuery 客户端 post 响应错误 - POST HTTP/1.1" 400
jQuery error in client post response - POST HTTP/1.1" 400
我无法弄清楚我的代码有什么问题,而且我对 jQuery 也不是很好。
我正在尝试构建 HTML 表单来保存汽车数据。它基于这种形式:
HTML源代码is here.
表单数据在按钮上发送,点击结束返回程序。
我用级联 制造商(代码中的 proizvodjac) 和基于 this code 的汽车 型号 下拉列表升级了该表格。但它不起作用。
我一直收到 HTTP 400,这意味着我来自客户端的 POST 调用格式不正确。
这是我的 jQuery 函数:
$(function () {
var carsdata = {"alfaromeo":["mito","156","147","giulietta","159","166","146"],"audi":["a3","a4","a6","a5","80","a1","q3","a8","q5"],"bmw":["320","116","x3","316","318","118","530","x1","520","x5","525","330","120","323","serija 1"],"chevrolet":["spark","lacetti","captiva","aveo","cruze"],"citroen":["c4","c4 grand picasso","c3","c5","c4 picasso","xsara","berlingo","c2","xsara picasso","saxo","ds5","c1"],"fiat":["brava","bravo","panda","grande punto","stilo","punto","punto evo","doblo","500","tipo","uno","coupe"],"ford":["c-max","fiesta","focus","mondeo","fusion","ka","escort"],"honda":["civic","accord","cr-v"],"hyundai":["getz","i10","i20","atos","i30","coupe","elantra","accent","santa fe","ix35","tucson"],"kia":["rio","pro_cee'd","sportage","cee'd","pride","sorento"],"mazda":["3","2","323 f","626","6","cx-5","323","premacy","5"],"mercedes":["a-klasa","c-klasa","e-klasa","b-klasa","124"],"mercedes-benz":["e-klasa","clk-klasa","c-klasa","s-klasa","190","a-klasa","b-klasa","c t-model","ml-klasa","w 124","124"],"nissan":["qashqai","x-trail","note","primera","micra","juke","almera"],"opel":["corsa","astra","zafira","meriva","vectra","insignia","mokka","tigra","combo","astra gtc","kadett"],"peugeot":["308","207","206","306","106","307","208","406","508","407","partner","3008","405"],"renault":["thalia","clio","scenic","grand scenic","kangoo","captur","megane grandtour","megane","laguna","5","megane break","twingo","modus","kadjar","megane classic","espace","megane scenic","megane coupe","megane sedan"],"seat":["toledo","leon","ibiza","altea","cordoba"],"skoda":["fabia","octavia","120","superb","felicia","rapid"],"smart":["fortwo"],"toyota":["corolla","yaris","auris","avensis","rav 4","land cruiser"],"vw":["polo","golf v","golf iv","golf vii","passat","golf vi","jetta","passat variant","caddy","sharan","tiguan","golf variant","golf ii","vento","golfplus","golf iii","bora","touran","touareg","up!"]};
var proizvodjac = $('<select id="proizvodjac"></select>');
var model = $('<select id="model"> </select>');
$.each(carsdata, function(item, key) {
proizvodjac.append('<option >' + item + '</option>');
});
$("#containerProizModel").html(proizvodjac);
$("#proizvodjac").on("change", function(e) {
var item;
var selected = $(this).val();
if (selected === "alfaromeo") {
item = carsdata[selected];
} else {
item = carsdata[selected];
}
$(model).html('');
$.each(item, function(item, key) {
model.append('<option >' + key + '</option>');
});
});
$("#containerProizModel").append(model);
$("button#predict").click(function(e){
e.preventDefault();
/*Get for variabes*/
var kilometraza = $("#kilometraza").val(), godina_proizvodnje = $("#godina_proizvodnje").val();
var snaga_motora = $("#snaga_motora").val(), vrsta_goriva = $("#vrsta_goriva").val();
/*create the JSON object*/
var data = {"kilometraza":kilometraza, "godina_proizvodnje":godina_proizvodnje, "proizvodjac":proizvodjac, "model":model, "snaga_motora":snaga_motora, "vrsta_goriva":vrsta_goriva}
/*send the ajax request*/
$.ajax({
method : "POST",
url : window.location.href + 'api',
data : $('form').serialize(),
success : function(result){
var json_result = JSON.parse(result);
var price = json_result['price'];
swal('Predviđena cijena auta je '+price+' kn', '','success')
},
error : function(){
console.log("error")
}
})
})
})
注释和解释在代码中。
在服务器端:
服务器需要 user_input
字典,它是根据 POST 请求返回的变量构建的。下面是 API 方法的样子:
@app.route('/api',methods=['POST'])
def get_delay():
result=request.form
proizvodjac = result['proizvodjac']
model = result['model']
godina_proizvodnje = result['godina_proizvodnje']
snaga_motora = result['snaga_motora']
vrsta_goriva = result['vrsta_goriva']
kilometraza = result['kilometraza']
user_input = {'proizvodjac':proizvodjac,
'model':model,
'godina_proizvodnje':godina_proizvodnje,
'snaga_motora':snaga_motora,
'vrsta_goriva':vrsta_goriva,
'kilometraza':kilometraza
}
print(user_input)
a = input_to_one_hot(result)
price_pred = gbr.predict([a])[0]
price_pred = round(price_pred, 2)
return json.dumps({'price':price_pred});
来自 Google Chrome 开发者控制台的错误:
指向:
编辑 1:
我不知道如何将 proizvodjac 和模型传递给 onClick 函数。查看断点处发生了什么:
网络选项卡上的 XHR:
HTML 表单正在填写数据 OK 只有制造商和型号没有传递给 onClick:
编辑 2:
越来越接近解决方案。我已经添加了:
var proizvodjac = $("#proizvodjac").val()
var model = $("#model").val()
按照提示,现在所有变量都成功传递了!
但我仍然收到错误 400,因为最终 ajax POST 调用卡在某处..
编辑 3:
更改自
data : $('form').serialize()
至
data = data
AJAX方法接收一切正常:
还是不行。
这里主要有两个问题:
1) 您没有从两个字段中正确获取值。您需要添加
var proizvodjac = $("#proizvodjac").val()
var model = $("#model").val()
在 $("button#predict").click(function(e){
函数内。
2) 您正在收集所有这些值并将它们放入您的 data
变量中......但是您没有对它做任何事情。您的 AJAX 请求关于要发送的数据配置如下:
data : $('form').serialize()
serialize() 函数会自动从您的 <form>
标签中的字段中获取所有原始数据。在您的场景中,如果您想根据 data
对象发送一组自定义数据(而不仅仅是表单的原样内容),那么您只需将其更改为
data: data
因此它在 POST 请求中发送来自该对象的信息。
我无法弄清楚我的代码有什么问题,而且我对 jQuery 也不是很好。 我正在尝试构建 HTML 表单来保存汽车数据。它基于这种形式:
HTML源代码is here.
表单数据在按钮上发送,点击结束返回程序。
我用级联 制造商(代码中的 proizvodjac) 和基于 this code 的汽车 型号 下拉列表升级了该表格。但它不起作用。
我一直收到 HTTP 400,这意味着我来自客户端的 POST 调用格式不正确。
这是我的 jQuery 函数:
$(function () {
var carsdata = {"alfaromeo":["mito","156","147","giulietta","159","166","146"],"audi":["a3","a4","a6","a5","80","a1","q3","a8","q5"],"bmw":["320","116","x3","316","318","118","530","x1","520","x5","525","330","120","323","serija 1"],"chevrolet":["spark","lacetti","captiva","aveo","cruze"],"citroen":["c4","c4 grand picasso","c3","c5","c4 picasso","xsara","berlingo","c2","xsara picasso","saxo","ds5","c1"],"fiat":["brava","bravo","panda","grande punto","stilo","punto","punto evo","doblo","500","tipo","uno","coupe"],"ford":["c-max","fiesta","focus","mondeo","fusion","ka","escort"],"honda":["civic","accord","cr-v"],"hyundai":["getz","i10","i20","atos","i30","coupe","elantra","accent","santa fe","ix35","tucson"],"kia":["rio","pro_cee'd","sportage","cee'd","pride","sorento"],"mazda":["3","2","323 f","626","6","cx-5","323","premacy","5"],"mercedes":["a-klasa","c-klasa","e-klasa","b-klasa","124"],"mercedes-benz":["e-klasa","clk-klasa","c-klasa","s-klasa","190","a-klasa","b-klasa","c t-model","ml-klasa","w 124","124"],"nissan":["qashqai","x-trail","note","primera","micra","juke","almera"],"opel":["corsa","astra","zafira","meriva","vectra","insignia","mokka","tigra","combo","astra gtc","kadett"],"peugeot":["308","207","206","306","106","307","208","406","508","407","partner","3008","405"],"renault":["thalia","clio","scenic","grand scenic","kangoo","captur","megane grandtour","megane","laguna","5","megane break","twingo","modus","kadjar","megane classic","espace","megane scenic","megane coupe","megane sedan"],"seat":["toledo","leon","ibiza","altea","cordoba"],"skoda":["fabia","octavia","120","superb","felicia","rapid"],"smart":["fortwo"],"toyota":["corolla","yaris","auris","avensis","rav 4","land cruiser"],"vw":["polo","golf v","golf iv","golf vii","passat","golf vi","jetta","passat variant","caddy","sharan","tiguan","golf variant","golf ii","vento","golfplus","golf iii","bora","touran","touareg","up!"]};
var proizvodjac = $('<select id="proizvodjac"></select>');
var model = $('<select id="model"> </select>');
$.each(carsdata, function(item, key) {
proizvodjac.append('<option >' + item + '</option>');
});
$("#containerProizModel").html(proizvodjac);
$("#proizvodjac").on("change", function(e) {
var item;
var selected = $(this).val();
if (selected === "alfaromeo") {
item = carsdata[selected];
} else {
item = carsdata[selected];
}
$(model).html('');
$.each(item, function(item, key) {
model.append('<option >' + key + '</option>');
});
});
$("#containerProizModel").append(model);
$("button#predict").click(function(e){
e.preventDefault();
/*Get for variabes*/
var kilometraza = $("#kilometraza").val(), godina_proizvodnje = $("#godina_proizvodnje").val();
var snaga_motora = $("#snaga_motora").val(), vrsta_goriva = $("#vrsta_goriva").val();
/*create the JSON object*/
var data = {"kilometraza":kilometraza, "godina_proizvodnje":godina_proizvodnje, "proizvodjac":proizvodjac, "model":model, "snaga_motora":snaga_motora, "vrsta_goriva":vrsta_goriva}
/*send the ajax request*/
$.ajax({
method : "POST",
url : window.location.href + 'api',
data : $('form').serialize(),
success : function(result){
var json_result = JSON.parse(result);
var price = json_result['price'];
swal('Predviđena cijena auta je '+price+' kn', '','success')
},
error : function(){
console.log("error")
}
})
})
})
注释和解释在代码中。
在服务器端:
服务器需要 user_input
字典,它是根据 POST 请求返回的变量构建的。下面是 API 方法的样子:
@app.route('/api',methods=['POST'])
def get_delay():
result=request.form
proizvodjac = result['proizvodjac']
model = result['model']
godina_proizvodnje = result['godina_proizvodnje']
snaga_motora = result['snaga_motora']
vrsta_goriva = result['vrsta_goriva']
kilometraza = result['kilometraza']
user_input = {'proizvodjac':proizvodjac,
'model':model,
'godina_proizvodnje':godina_proizvodnje,
'snaga_motora':snaga_motora,
'vrsta_goriva':vrsta_goriva,
'kilometraza':kilometraza
}
print(user_input)
a = input_to_one_hot(result)
price_pred = gbr.predict([a])[0]
price_pred = round(price_pred, 2)
return json.dumps({'price':price_pred});
来自 Google Chrome 开发者控制台的错误:
指向:
编辑 1:
我不知道如何将 proizvodjac 和模型传递给 onClick 函数。查看断点处发生了什么:
网络选项卡上的 XHR:
HTML 表单正在填写数据 OK 只有制造商和型号没有传递给 onClick:
编辑 2: 越来越接近解决方案。我已经添加了:
var proizvodjac = $("#proizvodjac").val()
var model = $("#model").val()
按照提示,现在所有变量都成功传递了! 但我仍然收到错误 400,因为最终 ajax POST 调用卡在某处..
编辑 3: 更改自
data : $('form').serialize()
至
data = data
AJAX方法接收一切正常:
还是不行。
这里主要有两个问题:
1) 您没有从两个字段中正确获取值。您需要添加
var proizvodjac = $("#proizvodjac").val()
var model = $("#model").val()
在 $("button#predict").click(function(e){
函数内。
2) 您正在收集所有这些值并将它们放入您的 data
变量中......但是您没有对它做任何事情。您的 AJAX 请求关于要发送的数据配置如下:
data : $('form').serialize()
serialize() 函数会自动从您的 <form>
标签中的字段中获取所有原始数据。在您的场景中,如果您想根据 data
对象发送一组自定义数据(而不仅仅是表单的原样内容),那么您只需将其更改为
data: data
因此它在 POST 请求中发送来自该对象的信息。