【问题标题】:500 (Internal Server Error) transform node request to fetch request500(内部服务器错误)将节点请求转换为获取请求
【发布时间】:2018-08-10 08:45:25
【问题描述】:

您好,我正在使用本机反应,并且我在带有请求 js 的节点中有一个请求。我不想再在服务器上发出请求了。我想在前端做。我决定使用获取。 但是当我在前端做同样的请求时,我得到内部服务器错误 500 我只想要从响应中得到的 cookie。

这适用于节点:

var request = require('request');


var dataString2 = 'lmaction=doLogin&username=XXX&password=XXX';

var options2 = {
    url: 'https://onlineservice.klarmobil.de/login',
    method: 'POST',
    headers:{
    'Host': 'onlineservice.klarmobil.de',
    'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
    'Referer': 'https://www.klarmobil.de/',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Cookie': '_gali=kundenlogin'
},,
    body: dataString2
};

function callback2(error, response, body) {
    const cookie= response.headers['set-cookie'][0].split(";")[0] 
}

request(options2, callback2);

这是我在 react native 中的代码:

fetch('https://onlineservice.klarmobil.de/login', {
    method: 'POST', // or 'PUT'
    body: 'lmaction=doLogin&username=xxx&password=xxx'
    headers:{
        'Host': 'onlineservice.klarmobil.de',
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'de,en-US;q=0.7,en;q=0.3',
        'Referer': 'https://www.klarmobil.de/',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1',
        'Cookie': '_gali=kundenlogin'
    }
  })
  .catch(error => console.log('Error:', error))
  .then((res)=>{
    console.log(res)
    const cookie= response.headers['set-cookie'][0].split(";")[0] 
    console.log(cookie)
  })

有人可以帮助我吗?

【问题讨论】:

  • i get internal server error 500 - 检查服务器日志以了解错误原因
  • 请求的服务器不是我的。您是否收到节点内部服务器错误 500?
  • 是吗?不,但是我没有运行您的代码-顺便说一句,我认为您不能在 fetch 中设置 cookie 标头(或引用者)(尽管在本机反应中可能有所不同)-有什么方法可以准确地看到请求发送的内容 - 您可以进行某种调试
  • 我用这个请求调用的服务不是我的。使用节点它可以工作。我只收到错误 500 并做出原生反应
  • 显然该请求缺少某些内容,但除非您可以准确调试请求标头和正文的外观,否则这将很难

标签: javascript node.js react-native request fetch


【解决方案1】:

如果我使用 Chrome 原生 fetch 执行此操作,它不包括 Cookie 标头(正如 Jaromanda X 猜测的那样)。

此外,您似乎无法覆盖Referer(可能还有其他一些受保护的标头),对我来说,它是与当前站点(“https://stackoverflow.com/”)一起发送的。这似乎是问题的原因,如果我发送除“klarmobil”Referer 之外的任何内容,则会发生 500 错误:

curl -i "https://onlineservice.klarmobil.de/login" -H "Origin: https://stackoverflow.com" -H "Accept-Encoding: r" -H "Accept-Language: de,en-US;q=0.7,en;q=0.3" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36" -H "Content-Type: application/x-www-form-urlencoded" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" -H "Referer: https://www.klarmobil.de/" -H "Connection: keep-alive" -H "DNT: 1" --data "lmaction=doLogin^&username=xxx^&password=xxx"
-> 200

curl -i "https://onlineservice.klarmobil.de/login" -H "Origin: https://stackoverflow.com" -H "Accept-Encoding: r" -H "Accept-Language: de,en-US;q=0.7,en;q=0.3" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36" -H "Content-Type: application/x-www-form-urlencoded" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" -H "Referer: https://stackoverflow.com/" -H "Connection: keep-alive" -H "DNT: 1" --data "lmaction=doLogin^&username=xxx^&password=xxx"
-> 500

另外,我认为以编程方式登录外国网站“伪造”请求并提取类似的 cookie 既不道德也不是一个好主意。由于他们没有为此提供 API,因此这可能不是有意的。他们还可能随时更改登录系统,而您的程序会中断。

【讨论】:

  • 我不想用这个做坏事。我只想从移动提供商那里获得我消耗的数据量。你知道我该如何解决这个问题吗?我应该将请求路由到发出请求的服务器,还是可以在本机反应中使用 request.js?有一个应用程序在反应原生时与谷歌浏览器相同的行为吗?由于安全原因,Chrome 是否不允许设置一些标头选项,但也可以在 react native 中设置?
  • Should I route the request to a server which makes the request - 是的
  • 是的,这可能并不完全适用于 react-native fetch。无论如何,我想分享我的发现,因为它显示了 500 的可重现情况以及修复它的参数。您需要调试应用发出的实际请求并检查它包含哪些标头。
  • 通过服务器代理您的请求似乎是个好主意。
  • 与您的程序化问题完全无关:您可以通过 Telekom 提供的移动网络(如 klarmobil)访问 datapass.de 轻松查看您使用的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多