【问题标题】:net.request post data not workingnet.request 发布数据不起作用
【发布时间】:2017-06-09 19:43:29
【问题描述】:

使用 net.request 发布数据不起作用。它正在到达 URL。但没有公布数据。我的代码如下。请帮我解决这个问题。

const net = remote.net;
const querystring = require('querystring');

//**
var postData = querystring.stringify({
    'username' : 'test',
    'password': 'test'
});

const request = net.request({
  method: 'POST',
  url: 'http://127.0.0.1/post.php',
});

request.on('error', (error) => {});

request.on('response', (response) => {});


request.write(postData);
request.end();

【问题讨论】:

  • 我在这里可能是错的,但你真的是指remote.net吗?如果是这样,它在哪里定义,因为它似乎没有在 Electron API 文档中定义?
  • 是的,const remote = require('electron').remote 或 const net = require('electron').remote.net;

标签: javascript node.js electron


【解决方案1】:

我知道已经有一段时间了。但是对于接下来会遇到同样问题的人。

不要忘记您必须在标题中声明“postData”的大小。 例如:

var postData = JSON.stringify({"q" : sqlQuery });
const request = net.request({
        method: 'POST',
        protocol: 'http:',
        hostname: '127.0.0.1',
        port: 3000,
        path: '/select',
        headers: {
          'Content-Type': 'application/json',
          'Content-Length': postData.length
        }
       }) 
request.on('response', (response) => {
.... // Something
})
request.write(postData)
request.end()

【讨论】:

  • 我不需要length,但'Content-Type': 'application/x-www-form-urlencoded' 为我工作。
【解决方案2】:

使用net.request时,您需要在写入数据后调用request.end(),以确保请求数据已发送。

您需要调用request.end() 的原因是允许在实际发出请求之前对请求的标头和正文进行更改。

request() 将连接并等待request.end() 一次性发送标头和正文。

此外,如果您想了解代码在做什么,忽略响应绝不是一个好主意。

您确实应该挂钩request.response 事件以查看发生了什么错误(如果有),如下所示:

request.on('response', (response) => {
  console.log(`STATUS: ${response.statusCode}`)
  console.log(`HEADERS: ${JSON.stringify(response.headers)}`)
})

更新 - 每条评论

您的代码应为(扩展自 Electron API 文档中 net 的示例代码):

const request = net.request({
  method: 'POST',
  url: 'http://127.0.0.1/post.php',
})

let body = ''

request.on('response', (response) => {

  // check response.statusCode to determine if the request succeeded
  console.log(`STATUS: ${response.statusCode}`)
  console.log(`HEADERS: ${JSON.stringify(response.headers)}`)

  // capture body of response 
  // - can be called more than once for large result
  response.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`)
    body += chunk.toString()
  })

  // when response is complete, print body
  response.on('end', () => {
    console.log(`BODY: ${body}`)
  })
})

request.write(postData)

request.end()

【讨论】:

  • 是的,创建请求,钩住response事件,写入数据,然后调用request.end()
  • 它似乎不起作用。我已经为 post.php 中的数据创建了一个日志。它没有收到 postData
  • 请用重构的代码更新您的问题。
  • 这对我不起作用。调用 net.request 时请求发送,调用 request.write(postData) 时没有任何反应。是不是电子版的问题。我的电子版是 1.4
  • @Jay 我也无法让它工作,并且看到与 Jay 相同的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多