Javascript Can';执行POST请求时,请不要在node.js版本的XMLHttpRequest上正确发送请求正文

Javascript Can';执行POST请求时,请不要在node.js版本的XMLHttpRequest上正确发送请求正文,javascript,node.js,oauth-2.0,xmlhttprequest,Javascript,Node.js,Oauth 2.0,Xmlhttprequest,我正在尝试使用NodeJS和找到的XMLHttpRequest库向MicrosoftOAuth2.0令牌URL发出PSOT请求。然而,我有一个问题,就是我不能在请求的同时发送一个合适的请求主体。我已经试过从中使用FormData,我试过URLSearchParams,我试过用GET请求中的地址栏知道的方式将其设置为字符串。下面您可以看到我在GET URL表单中尝试使用的代码,在我推荐的部分,您可以看到我尝试使用FormData var xhr=new-XMLHttpRequest(); xhr.

我正在尝试使用NodeJS和找到的XMLHttpRequest库向MicrosoftOAuth2.0令牌URL发出PSOT请求。然而,我有一个问题,就是我不能在请求的同时发送一个合适的请求主体。我已经试过从中使用
FormData
,我试过
URLSearchParams
,我试过用GET请求中的地址栏知道的方式将其设置为字符串。下面您可以看到我在GET URL表单中尝试使用的代码,在我推荐的部分,您可以看到我尝试使用FormData

var xhr=new-XMLHttpRequest();
xhr.open(“POST”https://login.microsoftonline.com/common/oauth2/v2.0/token');
/*var data=new FormData();
//var data=新的URLSearchParams();
data.append('client_id',clientId);
数据。追加(“授权类型”、“授权代码”);
附加数据(“范围”、“openid电子邮件配置文件”);
数据。追加(“代码”,代码);
data.append(“重定向uri”,“http://”+req.headers.host+req.url);
数据。追加(“客户机密”,机密);
此参数的错误消息:TypeError[ERR_INVALID_ARG_TYPE]:第一个参数的类型必须是string或Buffer、ArrayBuffer、Array或类似于Array的对象的实例。收到FormData的实例
与URLSearchParams相同的消息,只是它收到了URLSearchParams的实例
*/
变量数据='客户端id='+客户端id;
数据+='&授权类型=授权代码';
data+='&scope=openid%20email%20profile';
数据+='&代码='+代码;
data+='&redirect_uri='+encodeURIComponent(“http://”+req.headers.host+req.url);
数据+='&客户机密='+机密;
//这封邮件给了我一条来自Microsoft的错误消息:{“error”:“invalid_request”,“error_description”:“AADSTS900144:请求正文必须包含以下参数:'grant_type'。\r\n访问ID:ratherNotSay\r\n相关ID:ratherNotSay\r\n访问标记:2020-02-10 10:37:36Z”,“错误代码”:[900144],“时间戳”:“2020-02-10:37:36Z”,“跟踪ID”:“ratherNotSay”、“相关id”:“ratherNotSay”、“错误uri”:https://login.microsoftonline.com/error?code=900144"}
//这一定意味着请求机构不能以正确的方式提交。
xhr.onreadystatechange=()=>{
if(xhr.readyState==4){
console.log(xhr.status+“\n”+xhr.responseText+“\n”);
}
};
发送(数据);

您可以使用该方法将
URLSearchParams
实例转换为查询字符串,就像您手动构建的查询字符串一样

我不知道在
节点XMLHTTPRequest
版本中,
内容类型
标题是否默认设置为
应用程序/x-www-form-urlencoded
,但手动设置它不会有什么坏处

const xhr = new XMLHttpRequest();
xhr.open("POST", 'https://login.microsoftonline.com/common/oauth2/v2.0/token');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

const data = new URLSearchParams();
data.append('client_id', clientId);
data.append("grant_type", "authorization_code");
data.append("scope", "openid email profile");
data.append("code", code);
data.append("redirect_uri", "http://" + req.headers.host + req.url);
data.append("client_secret", secret);

xhr.onreadystatechange = () => {
    if (xhr.readyState == 4) {
        console.log(xhr.status + "\n" + xhr.responseText + "\n");
    }
};

xhr.send(data.toString());

这个API的文档在哪里?它说了什么?它希望参数是字符串还是JSON?通常POST请求的负载是JSON。字符串用于GET请求,在URL的末尾,您会找到文档的链接,但我会尝试将信息作为JSON发送,谢谢您的想法。哈,我明白了,您缺少了标题:
内容类型:application/x-www-form-urlencoded
。非常感谢您,您的解决方案和标记的响应对我帮助很大。