【问题标题】:Javascript: postAjax doesn't post anythingJavascript:postAjax 不发布任何内容
【发布时间】:2013-01-06 00:02:02
【问题描述】:

早安!

我正在编写一个小型 AJAX 应用程序,使用 this 函数作为基础,php 作为服务端语言。

这里是涉及的javascript代码

var dati = {};
dati.nome = d.getElementById('nome').value;
dati.cognome = d.getElementById('cognome').value;
console.log(dati);
url = "post.php";
jsonToPost = dati;
console.log(url);

processResponse = function(responseText){
    console.log(responseText);
    d.getElementById('response').innerHTML = responseText;
}
_SU3.postAjax(url, processResponse, jsonToPost);
});

这是我的 php 代码,只是一个用于测试 ajax 的后处理器

<?php
if(isset($_POST['nome'])){

$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$data['nome'] = $nome;
$data['cognome'] = $cognome;

$data = json_encode($data);

echo $data;
} else {
    echo "Errore!";
}
?>

我从 ajaxRequest 得到的响应是“Errore!”,这意味着它没有向脚本发布任何内容。

我是否遗漏了任何明显的错误?还是我做错了什么?

_SU3.ajax() 函数(请参阅 this 以供参考)工作得很好,所以我很惊讶它不起作用

---编辑广告萤火虫响应--- 我希望我发布了正确的内容

request headers:
POST /~francesco/post.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/2010010 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost/~francesco/ajax.html
Content-Length: 26
Pragma: no-cache
Cache-Control: no-cache

Screenshot 在屏幕截图中还有其他信息。

【问题讨论】:

  • 您是否尝试过使用某种代理(例如 fiddler)检查发送到服务器的数据?
  • 请同时发布提琴手响应。这更有用。 _SU3.postAjax(url, processResponse, jsonToPost); 是什么?这是从哪里得出的?
  • @JustinBicknell 你能给我推荐一个 fiddler 的 mac 替代品吗?
  • @DavidL _SU3.postAjax() 是我链接的脚本中的一个函数,它在这里stackoverflow.com/questions/5350377/…
  • @FrancescoZaffaroni 我可以推荐 Firebug,它是 Firefox 的插件。它在观看 http 请求时几乎和 fiddler 一样好用,并且还有一些不错的调试工具

标签: php javascript ajax post


【解决方案1】:

您可能想要替换该行:

ajaxRequest.send("data=" + encodeURIComponent(data));

在 _SU3.postAjax 中:

ajaxRequest.send(data);

然后将第三个参数 (jsonToPost) 作为字符串发送,如下所示:

"nome=arg1&cognome=arg2"

例如:

"nome="+d.getElementById("nome").value + "&cognome="+d.getElementById("cognome").value`

【讨论】:

  • 谢谢,但我真的很想发送 JSON 格式的数据,只是为了保持一切整洁美观,并在与其他代码集成时具有更大的灵活性。
  • @FrancescoZaffaroni 您的 php 代码应该使用 puckipedia 建议的方法
  • @JustinBicknell php 代码并不重要;)它只是为了测试
  • @FrancescoZaffaroni 在这种情况下 php 代码很重要,如果您使用提供的链接建议的方法,您的 php 将不得不解析 json 字符串
  • @FrancescoZaffaroni 我喜欢我提供的解决方案。请记住,您始终可以将 JSON 字符串作为传入对象的属性传递,然后在服务器上解析它(如果需要)
【解决方案2】:

按照 puckipedia 的建议,您需要将要发送的对象编码为查询字符串。下面的方法会根据传入的对象创建参数字符串:

_SU3.postAjax = function(url, callback, data) {

   var parameters = '';

   for (var p in data){
     parameters  += p + '=' + encodeURIComponent(data[p]) + '&';
   }

   var ajaxRequest = _SU3.getAjaxRequest(callback);
   ajaxRequest.open("POST", url, true);
   ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajaxRequest.setRequestHeader("Connection", "close");
   ajaxRequest.send(parameters);
}

您提供的链接中建议的函数假设您传递的是 JSON,而不是 js 对象。

注意:您发布的服务器代码应正确解释数据:

$nome = $_POST['nome'];

【讨论】:

  • 非常感谢,您能解释一下为什么它对发布原始问题的用户有用吗? (stackoverflow.com/questions/5350377/…)?
  • @FrancescoZaffaroni 该方法假设传入的数据已经被字符串化......所以替代方法是在调用 postAjax 函数之前对你的 javascript 对象进行字符串化,然后在服务器上解析 json 跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多