获取正文数据无效的帖子参数为空

Posted

技术标签:

【中文标题】获取正文数据无效的帖子参数为空【英文标题】:Fetch post with body data not working params empty 【发布时间】:2017-02-12 00:17:54 【问题描述】:

我正在尝试重写我的 ajax 调用以获取:

阿贾克斯:

  $.post(
    context: this,
    url: "/api/v1/users",
    data:  
      user: 
        
          email: email,
          password: password
         
    
  ).done((user) => 
  ).fail((error) => 
  )

获取:

  fetch('/api/v1/users',   
  method: 'POST',
  headers: 
    "Content-Type": "application/json"
  ,      
    body:  
    "user" : 
      
        "email" : email,
        "password" : password
       
  
  )
  .then(res =>   
    if (res.status !== 200)  
        console.log("error")
      )          
     else 
      res.json().then(data => 
        console.log(data)
      )
    
  )

我收到一个错误的空参数〜来自我的服务器的错误请求。

我也找到了这种方法,但是在下面的这段代码中我得到了一个错误:Unexpected token.

  var payload =  
    "user" : 
      
        "email" : email,
        "password" : password
       
  ;

  var data = new FormData();
  data.append( "json", JSON.stringify( payload ) );

  fetch('/api/v1/users',   
  method: 'POST',
  headers: 
    "Content-Type": "application/json"
  ,      
    body: data
  )

如何重写 ajax 请求来获取?

【问题讨论】:

【参考方案1】:

你应该试试这个:

fetch('/api/v1/users', 
    method: 'post',
    body: JSON.stringify("user":
        "email": email,
        "password": password
    ),
);

fetch API

【讨论】:

谢谢,这与我的问题中的第二个示例基本相同。尽管 ajax 版本工作得很好,但它仍然显示参数丢失。【参考方案2】:

在github上关注了这个话题:https://github.com/matthew-andrews/isomorphic-fetch/issues/34

我的问题的解决方案是使用 JSON.stringify 函数并将 Content-Type 标头设置为 application/json。不太清楚为什么我的问题中的第二次尝试没有奏效。

fetch('/api/v1/users',   
    method: 'post',
    headers: 'Content-Type': 'application/json',
    body: JSON.stringify( "user": 
      "email" : email,
      "password" : password
    ),
)

官方 MDN 文档:

var myHeaders = new Headers();
myHeaders.append('Content-Type', 'application/json');

fetch('/contact-form', 
    method: 'POST',
    headers: myHeaders,
    mode: 'cors',
    cache: 'default',
    body: JSON.stringify(fields)
).then(() => 
    dispatch(contactFormSubmitSuccess());
);

【讨论】:

(它在 chrome 中失败,而不是这个,我将参数编码为 url) 按照 Dudis 的建议添加标题对我有用,谢谢! 对我不起作用,fetch 仍在做get 而不是发帖!【参考方案3】:

body 作为json 发送失败时以这种方式工作。

        var formData = new FormData();
        formData.append('key1', 'value1');
        formData.append('key1', 'value2');

        fetch('url', 
            method: 'post',
            headers: 
                'Accept': 'application/json',
                'Content-Type': 'multipart/form-data'
            ,
            body: formData
        `)`

编辑:就我而言,服务器仅通过表单数据提交来识别内容。该代码未编写为将请求正文读取为 json。因此,您的服务器端代码也可能存在问题。

【讨论】:

经过大量的努力,上述方法对我有用。谢谢你的解释。【参考方案4】:
headers: 'Content-Type': 'application/json'

已经回答了

【讨论】:

是的,标题压力不够。当问题是我在标题中拼错应用程序时,我花了太长时间感到困惑。第一步是检查错别字。 这确实发生在我身上,具有完全相同的提取功能。可以强调 Jacob C. 所说的足够多。错字的人! 对我来说是 'header: 'Content-Type': 'application/json''。血腥的错别字 没有 s,它只会让你多花一天的时间。 :(【参考方案5】:

如果您使用 Express 服务器来处理请求,请确保添加以下行:

app.use(express.json(limit:'1mb'))

【讨论】:

【参考方案6】:

TL;DR 如果没有mode: 'cors',您的 JSON 正文将无法通过。

我为此挣扎了一会儿。 cors 是问题所在。假设您正在执行从一个域到另一个域的请求(即从localhost:8080localhost:3000),您需要在获取设置中有mode: 'cors' 并且您的接收域(localhost:3000)需要允许来自发送域的请求(localhost:8080)。

所以上面代码中的描述:

来自localhost:8080的请求到localhost:3000

fetch('http://localhost:3000/users/sign_in', 
      method: 'POST',
      mode: 'cors', // this cannot be 'no-cors'
      headers: 
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      ,
      body: JSON.stringify(
        "user": 
          "email": `$this.state.userEmail`,
          "password": `$this.state.userPass`
        
      ),
    )

然后确保您的接收域 localhost:3000 允许来自 localhost:8080 的 CORS。

【讨论】:

【参考方案7】:

尝试将 (body-parser) 放在 app.js / server.js 的顶部:

app.use(bodyParser.json());

【讨论】:

以上是关于获取正文数据无效的帖子参数为空的主要内容,如果未能解决你的问题,请参考以下文章

无论 Content-Type 标头如何,在 Python Flask 中获取原始 POST 正文

响应正文为空(获取请求)[重复]

如何正确格式化发布请求的正文?

从 .NET Framework 4.6 迁移到 .NET5 后,API 帖子正文为空

Sql 语句。获取指定表的列名

值不能为空。参数名称:尝试使用 web api 获取数据时的源