如何根据 curl 请求在 Node 中发出 http post 请求?
How do I make a http post request in Node based off of a curl request?
Paypal 要求发出以下 curl 请求
curl -v POST https://api-m.sandbox.paypal.com/v1/oauth2/token \
-H "Accept: application/json" \
-H "Accept-Language: en_US" \
-u "CLIENT_ID:SECRET" \
-d "grant_type=client_credentials"
但是,我想改为通过 HTTP 请求来执行此操作。我尝试了以下方法:
const HTTP = require('http')
const data = JSON.stringify({
paypalclientid:paypalsecretid,
"grant_type": "client_credentials",
})
const options = {
host: 'api-m.sandbox.paypal.com',
port: 80,
path: '/v1/oauth2/token',
method: 'POST',
headers: {
'Accept': 'application/json',
"Accept-Language": "en_US"
}
}
const req = http.request(options, res => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.write(data)
req.end()
我得到了以下信息:
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
You don't have permission to access "http://api-m.sandbox.paypal.com/v1/oauth2/token" on this server.<P>
Reference #18.9ce33e17.1609625956.708d702f
</BODY>
</HTML>
这就是您执行普通 GET 请求时得到的结果。
看来你需要 basic authentication:
const options = {
auth: 'CLIENT_ID:SECRET',
...
您还应该使用端口 443 (HTTPS),以及:
'Content-Type': 'application/x-www-form-urlencoded'
对于这个特定的令牌请求(几乎所有其他 PayPal REST 端点都采用 application/json
)
- 您需要对您的凭据进行 base64 编码并将它们以
Authorization
header. 的形式发送
- 您需要通过 https 进行请求。
- 您需要对内容进行编码。
这是一个使用有效 user
和 pass
的示例:
const https = require('https')
const data = `grant_type=client_credentials`;
const user = 'your client id';
const pass = 'your secret';
const authorization = `Basic ` + Buffer.from(`${user}:${pass}`).toString(`base64`);
const options = {
hostname: 'api.paypal.com',
port: 443,
path: '/v1/oauth2/token',
method: 'POST',
headers: {
'Authorization': authorization,
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': data.length
},
}
const req = https.request(options, res => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.write(data)
req.end()
Paypal 要求发出以下 curl 请求
curl -v POST https://api-m.sandbox.paypal.com/v1/oauth2/token \
-H "Accept: application/json" \
-H "Accept-Language: en_US" \
-u "CLIENT_ID:SECRET" \
-d "grant_type=client_credentials"
但是,我想改为通过 HTTP 请求来执行此操作。我尝试了以下方法:
const HTTP = require('http')
const data = JSON.stringify({
paypalclientid:paypalsecretid,
"grant_type": "client_credentials",
})
const options = {
host: 'api-m.sandbox.paypal.com',
port: 80,
path: '/v1/oauth2/token',
method: 'POST',
headers: {
'Accept': 'application/json',
"Accept-Language": "en_US"
}
}
const req = http.request(options, res => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.write(data)
req.end()
我得到了以下信息:
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>
You don't have permission to access "http://api-m.sandbox.paypal.com/v1/oauth2/token" on this server.<P>
Reference #18.9ce33e17.1609625956.708d702f
</BODY>
</HTML>
这就是您执行普通 GET 请求时得到的结果。
看来你需要 basic authentication:
const options = {
auth: 'CLIENT_ID:SECRET',
...
您还应该使用端口 443 (HTTPS),以及:
'Content-Type': 'application/x-www-form-urlencoded'
对于这个特定的令牌请求(几乎所有其他 PayPal REST 端点都采用 application/json
)
- 您需要对您的凭据进行 base64 编码并将它们以
Authorization
header. 的形式发送
- 您需要通过 https 进行请求。
- 您需要对内容进行编码。
这是一个使用有效 user
和 pass
的示例:
const https = require('https')
const data = `grant_type=client_credentials`;
const user = 'your client id';
const pass = 'your secret';
const authorization = `Basic ` + Buffer.from(`${user}:${pass}`).toString(`base64`);
const options = {
hostname: 'api.paypal.com',
port: 443,
path: '/v1/oauth2/token',
method: 'POST',
headers: {
'Authorization': authorization,
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': data.length
},
}
const req = https.request(options, res => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.write(data)
req.end()