首页 > 解决方案 > 如何使用 XMLHttpRequest 示例格式化 request.get

问题描述

目标

我想使用 npm 包request从 API 端点获取数据。我下面的示例XMLHttpRequest()用于获取数据。

问题

如何将转换XMLHttpRequest()request.get

示例代码

我正在关注的OnSIP 示例提供以下内容:

卷曲示例:

curl -X POST \
--data \
'Action=SessionCreate&Username=john.doe%40example.onsip.com&Password=mysuperpassword' \
https://api.onsip.com/api

XMLHttpRequest() 示例:

var data = new FormData();
data.append('Action', 'SessionCreate');
data.append('Username', 'john.doe@example.onsip.com');
data.append('Password', 'mysuperpassword');

var xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.onsip.com/api', true);
xhr.onload = function () {
  console.log(this.responseText);
}
xhr.send(data);

我试过的

卷曲

当我将凭据放入cURL命令时,我成功了,并且响应指示<IsValid>true</IsValid> .

节点.js

我举了一个cURL例子,并使用这个cURL 到 Node.js 工具开始。

// Config Settings
const onsipAction = "SessionCreate";
const onsipEmail = encodeURIComponent(onsipConfig.email);
const onsipPassword = onsipConfig.password;
const dataString = "Action=" + onsipAction +
                    "&Username=" + onsipEmail + 
                    "&Password=" + onsipPassword;

console.log("dataString :", dataString);
const onsipSessionCreateOptions = {
    url: "https://api.onsip.com/api",
    method: "POST",
    body: dataString
};

exports.getOnsipSessionId = function (request){
    return (new Promise((resolve, reject) => {
        request.get(onsipSessionCreateOptions, function (err, _resp, body) {
            if (err) reject(err);
            else {
                console.log("body :", body);
                resolve(body);
            }
        });
    }).catch(err => console.log("err:", err)));
};

日志

我在 中看到这个错误body,但不确定它是什么意思。 Accessor parameter is required, but none was specified.

datastring: Action=SessionCreate&Username=fakename%40jahnelgroup.onsip.com&Password=fakepass

这是body

<?xml version="1.0" encoding="UTF-8"?>
<Response
    xmlns="http://www.jnctn.net/ns/rest/2006-01">
    <Context>
        <Action>
            <IsCompleted>false</IsCompleted>
        </Action>
        <Request>
            <IsValid>false</IsValid>
            <DateTime>2019-02-06T15:18:10+00:00</DateTime>
            <Duration>1</Duration>
            <Errors>
                <Error>
                    <Parameter>Action</Parameter>
                    <Code>Accessor.Required</Code>
                    <Message>Accessor parameter is required, but none was specified.</Message>
                </Error>
            </Errors>
        </Request>
        <Session>
            <IsEstablished>false</IsEstablished>
        </Session>
    </Context>
</Response>

标签: javascriptnode.jscurlrequestxmlhttprequest

解决方案


问题

正如 Mo A 在他的回答中显示的那样,我错过了两件事:

  • request.get是错误的,而是request.post正确的。
  • OnSIP 端点已准备就绪formData

适合我的代码

// Config Settings
const onsipAction = "SessionCreate";
const onsipEmail = onsipConfig.email;
const onsipPassword = onsipConfig.password;
const options = { method: "POST",
    url: "https://api.onsip.com/api",
    headers: 
 { "content-type": "multipart/form-data;" },
    formData:
  { Action: onsipAction,
    Username: onsipEmail,
    Password: onsipPassword,
    Output: "json"
  }
};
exports.getOnsipSessionId = function (request){
    return (new Promise((resolve, reject) => {
        request.post(options, function (err, response, body) {
            if (err) reject(err);
            else {
                console.log("body :", body);
                resolve(body); // Contains SessionId
            }
        });
    }).catch(err => console.log("err:", err)));
};

感谢 Mo A、OnSIP 开发人员和 MShirk 的支持!


推荐阅读