【问题标题】:How can I make right XHR POST request in Firefox 28.0?如何在 Firefox 28.0 中发出正确的 XHR POST 请求?
【发布时间】:2014-05-31 20:24:25
【问题描述】:

在 Firefox 28.0 中进行简单的 XHR POST 后,我的服务器 php 脚本 POST 数组为空。请求同源。

在我的触发请求的 js 脚本中:

$(function(){
$("#head").click(function(){
var invocation=new XMLHttpRequest();
var url="test.php";
var body="hello";
if (invocation)
{
    invocation.open("POST",url, true);
    invocation.onreadystatechange=handler;
    invocation.send(body);
}
function handler(evtXHR){
    if(invocation.readyState===4)
    {
    if(invocation.status===200)

    {

       alert("success");
    }

    }
}
});
});

在我的 php 文件中,我有:

<?php
header('Access-Control-Allow-Origin: *');
$data=$_POST['body'];
var_dump($data);
?>

下面是客户端和服务端的交互:

Request Method:     POST
Status Code:    HTTP/1.1 200 OK

请求头:

User-Agent: Mozilla/5.0 (X11; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0
Referer:    .......
Pragma: no-cache
Host:   ..........
Content-Type:   text/plain; charset=UTF-8
Content-Length: 5
Connection: keep-alive
Cache-Control:  no-cache
Accept-Language:    en-US,en;q=0.5
Accept-Encoding:    gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

请求正文: 你好

响应标头

X-Powered-By:   PHP/5.2.17
Transfer-Encoding:  chunked
Server: Apache
Keep-Alive: timeout=5, max=100
Date:   Wed, 16 Apr 2014 19:04:55 GMT
Content-Type:   text/html
Connection: Keep-Alive
access-control-allow-origin:    *

请帮助弄清楚发生了什么。为什么请求成功后 POST 数组为空? 谢谢。

【问题讨论】:

  • 在我做出 Quentin 建议的更改后,我的 php 脚本中的 var_dump $_POST 仍然为 null,但是,HTTPfox 插件显示内容是 string(5) "hello" whan is use var_dump and "hello " 当我在脚本中使用 echo() 时。我该如何解决这些问题?

标签: javascript http firefox post xmlhttprequest


【解决方案1】:

您将请求正文编码为纯文本。 PHP 不会将其解析为 $_POST

要么访问原始消息体......

file_get_contents('php://input')

或者将请求中的数据编码成 PHP 可以理解的格式。

var data="hello";
var body = "someKeyName=" + encodeURIComponent(data);

// ...
invocation.open("POST",url, true);
invocation.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
invocation.send(body);

$data=$_POST['someKeyName'];

【讨论】:

  • 谢谢,我不知道该怎么做。我把 invocation.setRequestHeader("Content-Type","text/html");在我的 js 文件中,但这不起作用。我应该将纯文本编码为不同的 mime 类型吗?
  • 我按照你的建议做了所有事情,但是 POST 数组仍然是空的.. 问题可能是由其他原因引起的吗?
  • 我在 var_dump($_POST["someKeyName"]) 上有 NULL,但是 HTTPfox 插件显示 string(5) "hello",这表明 var_dump() 实际上说了些什么。因为当我在脚本中放置 echo() 而不是 var_dump() 时,HTTPfox 只写“hello”,因为 echo() 函数可以工作
  • 听起来你还在发送data而不是body
  • 不,不,我这样发送正文: var body="name=" + encodeURIComponent(data);然后调用.send(body);在 php 脚本中 var_dump($_POST['name']);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2022-12-04
  • 1970-01-01
  • 2012-12-15
  • 2014-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多