【问题标题】:Why doesn't CasperJS' sendAJAX function send any content for PUT requests?为什么 CasperJS 的 sendAJAX 函数不为 PUT 请求发送任何内容?
【发布时间】:2015-03-27 07:41:31
【问题描述】:

我想通过我的应用程序使用 PUT 方法更新 JSON 对象。我正在尝试部分模拟表单提交的操作。此调用是同步的,因为在 PUT 之后,应该返回 200。但是,当我尝试下面的代码时,sendAJAX 不包含对象的内容,PUT 请求的内容长度:0。通过表单提交具有所有正确的设置 - 内容类型、x-requested-with 等.我不太清楚为什么下面的代码不能按我的预期运行。我还尝试将 var 'data' 设置为一串 json 格式的参数。这也会导致 content-length: 0 的 PUT 请求。

我在这里做错了什么?

casper.then(function() {
    this.evaluate(function() {
    var element = document.querySelectorAll("h6");
    for (var i = 0; i < element.length; i++) {
        if (element[i].innerHTML == "Special Tag") {
            var appid = element[i].parentNode.parentNode.getAttribute("app-id");

            var wsurl = "https://appurl.net"+appid;
            var data = new Object();
            data.user_id = "xxxxx-xxxx-xxxx-xxxx-xxxx";
            data.name = "Name";
            data.description = "blahr blahr blahr";
            data.amount = "-9000000";
            data.start = 1409900400000;
            data.finish = 1412492400000;
            data.seq = 0;
            data.locked = false;
            data.paused = false;
            data.contributed_amount = 0;
            data.created = 1409920472782;
            data.modified = 1426538857339;
            data.color = "#E37368";
            data.archived = false;
            data.target_amount = null;
            data.uuid = "xxxx-xxxxx-xxxxx-xxxxxx";
            data.aprox_daily_contribution = 0;
            return JSON.parse(__utils__.sendAJAX(wsurl, "PUT", data, false, { contentType: "application/json"}));

【问题讨论】:

  • 1.您似乎没有使用 sendAJAX() 响应。你怎么知道内容是空的?您是否有机会查看casper.on("resource.received", function(res){...}); 事件输出? 2. 检查是否发送了完全相同的请求。也许在表单提交期间存在的标题在 XHR 期间不存在。使用例如 wireshark 来比较这些请求。
  • 我正在使用 resource.sent 和 resource.received。我的目标是模拟表单提交,但现在,我只想为表单操作生成一个类似的 PUT 请求。当我看到 resource.sent 时,内容长度标头设置为 0。我捕获了表单操作的请求。如果请求中的信息不完整或缺失,服务器会返回 500。我的 sendAjax() 组装 PUT 请求而不包含“数据”对象,服务器以 500“无内容”响应。我希望这能在一定程度上澄清我的问题。感谢您的回复。

标签: javascript casperjs put


【解决方案1】:

CasperJS 的 sendAJAX() 函数不支持 PUT 请求,如 code 所示:

xhr.send(method === "POST" ? dataString : null);

或者更准确地说,它只支持 POST 请求的有效负载。您必须自己构建 XHR 或相应地更改 CasperJS 代码。


我认为您不需要模拟表单提交。如果您正在测试 Web 应用程序,那么最好实际提交表单,然后检查它是否生成了正确的页面,而不是解析响应,因为您将需要两次有效地实现逻辑:在页面 JavaScript 和在您的测试脚本中。

【讨论】:

  • 感谢您澄清这一点。我正在为内部应用程序开发一个小型框架,该框架可以模糊发送到我们后端服务的参数。我想在适当的时候绕过前端验证器。这基本上是我第一次尝试编写一种方便的方法来测试应用程序参数。对于表单提交,我必须使用包装函数捕获 XMLHTTPRequest,并即时修改请求。我有这方面的代码,但我真的希望我至少可以使用 sendAJAX PUT 获得一个基本的概念证明。
  • 我明白了。直接使用 XMLHttpRequest 而不是 sendAJAX 就很简单了。
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 2012-02-10
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多