NodeJs http请求在xml中发送api密钥

问题描述

这是示例代码的原始 PHP 版本 =>

$curl = curl_init();
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_POST,TRUE);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);

///////////////////////////////////////////////////////////////////
/// login
$request='<?xml version="1.0" encoding="UTF-8" ?>
            <Params>
                <ApiKey>abc123</ApiKey>
            </Params>';
            
curl_setopt($curl,CURLOPT_URL,"https://api.unas.eu/shop/login");
curl_setopt($curl,CURLOPT_POSTFIELDS,$request);
$response = curl_exec($curl);
$xml=simplexml_load_string($response);
$token=(string)$xml->Token;

我是根据 nodejs 文档编写的。我也谷歌了解决方案,但没有找到并回答。为什么脚本无法连接到 unas 服务器?

const express = require("express");
const https = require("https");

const app = express();

const postData = '<?xml version="1.0" encoding="UTF-8" ?>'+
        '<Params>' +
        '<ApiKey>abc123</ApiKey>' +
        '</Params>';

const options = {
    protocol:'https:',host: "api.unas.eu/shop",path: "/login",method: "POST",headers:{
        'Content-Type': 'application/xml','Content-Length': Buffer.byteLength(postData)
    }
};

const req = https.request(options,(res) => {
    console.log('statusCode:',res.statusCode);
    console.log('headers:',res.headers);
  
    res.on('data',(d) => {
      process.stdout.write(d);
    });
  });
  
  req.on('error',(e) => {
    console.error(e);
  });
  req.end();

回复

Error: getaddrinfo ENOTFOUND api.unas.eu/shop
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26) {
  errno: -3008,code: 'ENOTFOUND',syscall: 'getaddrinfo',hostname: 'api.unas.eu/shop'

你能帮我弄清楚为什么它不起作用吗? 提前致谢。

解决方法

主机名不应包含路径:

修复方法如下:

const options = {
    protocol:'https:',host: "api.unas.eu",path: "/shop/login",method: "POST",headers:{
        'Content-Type': 'application/xml','Content-Length': Buffer.byteLength(postData)
    }
};

另一个问题:您没有正确传递帖子数据:

const req =...

req.write(postData);//send post data to the request

req.on('error',(e) => {
    console.error(e);
});
req.end();