JavaScript中GET请求Ajax传参问题:QUnit测试URL调用失败求助
我正在用QUnit编写JavaScript单元测试,尝试通过GET方法发起Ajax调用某个URL,但这个URL始终没被成功调用。以下是我的测试代码:
QUnit.test( "Importing Grid", function(assert) { var done = assert.async(); var data = { "info": {"view":"LATEST","mode": 1,"memberId": 1001,"baselineId": -1} } console.log(cuboid_id+" : "+cuboid_name); $.ajax({ url: Globals.baseURL + "rest/grid/"+cuboid_id, type: "GET", dataType: "application/json", data: JSON.stringify(data), contentType: "application/json", success: function(result){ console.log(JSON.stringify(result)); assert.equal(result !=null,true,"Response should not be null"); assert.equal(result[0].error,"Whitebaord ID NOT FOUND","InValid Whiteboard ID"); done(); } }); });
我试过一些相关方案但没效果,希望有人能指出Ajax调用需要修改的地方,提前感谢!
嘿,我看了你的代码,发现几个可能导致GET请求没成功触发的问题,咱们一个个梳理:
GET请求不要用
JSON.stringify(data)传参:GET请求的参数通常是附加在URL的查询字符串里,而非请求体中。jQuery的$.ajax处理GET请求时,如果你给data传普通对象,它会自动把对象转换成key=value格式的查询字符串拼到URL后。但你现在把data转成了JSON字符串,会导致参数格式错误,后端无法解析,甚至请求本身不符合规范。移除
contentType: "application/json"设置:这个参数是用来告诉服务器请求体的格式,但GET请求一般不会发送请求体,这个设置在这里完全没必要,甚至可能让服务器误解请求格式,导致请求被拒绝。检查
cuboid_id和cuboid_name的作用域:你的代码直接使用了这两个变量,如果它们不在当前测试函数的作用域内,console.log会抛出错误,后续的Ajax代码就不会执行了。先确认这两个变量是否正确定义并能正常访问。添加
error回调排查问题:目前你的代码只有success回调,一旦请求失败(比如404、500或参数错误),你根本不知道问题出在哪。加上error回调可以打印错误信息,方便快速定位问题。
修改后的代码示例:
QUnit.test( "Importing Grid", function(assert) { var done = assert.async(); // 先确认cuboid_id能正常访问 if (typeof cuboid_id === 'undefined') { assert.fail('cuboid_id is not defined'); done(); return; } var data = { "info": {"view":"LATEST","mode": 1,"memberId": 1001,"baselineId": -1} } console.log(cuboid_id+" : "+cuboid_name); $.ajax({ url: Globals.baseURL + "rest/grid/"+cuboid_id, type: "GET", dataType: "application/json", data: data, // 直接传对象,无需转JSON字符串 success: function(result){ console.log(JSON.stringify(result)); assert.ok(result !== null, "Response should not be null"); // 用ok断言更简洁 assert.equal(result[0].error, "Whiteboard ID NOT FOUND", "Invalid Whiteboard ID"); // 修正拼写错误:Whitebaord -> Whiteboard done(); }, error: function(xhr, status, error) { console.error('Ajax请求失败:', status, error); console.error('响应内容:', xhr.responseText); assert.fail('Ajax请求失败: ' + error); done(); } }); });
另外注意你断言里的拼写错误:Whitebaord应该是Whiteboard,这个也可能导致断言不通过,顺便帮你修正了。
内容的提问来源于stack exchange,提问作者Jaydeep Bobade

