我应该使用`php:// input`和/或`$ _POST`吗?

时间:2016-11-06 14:02:09

标签: php ajax api http post

我正在使用以下结构构建API:

  • 方法POST
  • uri /words
  • body {"word":"example"}

此请求应该向数据库添加单词,如果我通过httpie进行测试,一切正常。

$ http POST localhost:8000/words word="new word2"

HTTP/1.1 200 OK
Access-Control-Allow-Headers: application/json
Access-Control-Allow-Origin: http://localhost:8080
Connection: close
Content-Type: application/json
Host: localhost:8000
X-Powered-By: PHP/7.0.12-1+deb.sury.org~xenial+1
{
    "test": {
        "method": "POST",
        "input": {
            "word": "new word2"
        }, 
        "post": []
    }, 
    "words": {
        "id": "581f2f118b0414307476f7b3", 
        "word": "new word2"
    }
}

test中,我将php中获得的变量放在:

$method = $_SERVER['REQUEST_METHOD'];
$input =  json_decode(file_get_contents('php://input'),true);
$post =  $_POST;

我们可以看到$_POST为空。如果我使用javascript:

$(form).submit(function(e) {
    var url = "http://localhost:8000/words"; 
    var data = {"word" : form.elements["word"].value };
    $.ajax({
        type: "POST",
        url: url,
        data: data,
        dataType: 'json',
        success: function(data)
        {
            console.log(JSON.stringify(data)); 
        }
    });
    e.preventDefault(); 
});

我获得以下控制台日志:

{
   "test":{
      "method":"POST",
      "input":null,
      "post":{
         "word":"word from form"
      }
   },
   "words":{
      "id":"581f34b28b0414307476f7b6",
      "word":null
   }
}

现在input为空。 Word为空,因为我正在处理来自$input["word"]的{​​{1}}。我的问题:

  • 我应该处理php://input,还是检查两个变量?
  • 使用这些方法的最佳做法如何?
  • 我可以从浏览器发送$_POST,还是从命令行收费php://input发送$_POST

1 个答案:

答案 0 :(得分:1)

您手动构建的示例和JavaScript示例不等效。

首先,您使用application / json内容类型发送JSON编码数据。

在第二种情况下,您将JavaScript对象传递给jQuery,并允许它遵循它的默认行为,即使用application / x-www-form-urlencoded格式对其进行编码,并将其用作内容类型(就像提交常规HTML表单一样)。

PHP支持POST请求中的application / x-www-form-urlencoded数据,但不支持JSON。

  

我应该处理$ _POST,还是检查两个变量?

如果您要发送application / x-www-form-urlencoded数据或PHP支持的其他格式,请使用$_POST。否则,您需要从php://input获取原始数据并自行解析。

  

我可以从浏览器发送php://输入

请参阅POST data in JSON format

  

$ _ POST命令行收费如httpie?

请参阅the httpie documentation

http --form POST api.example.org/person/1 name='John Smith'