https
モジュールを次のように使用するNodeJSコードがあります:https.request(options, (res) => {......
ここで、options
は次のようなオブジェクトです
const options = {
hostname: SERVICE_HOSTNAME,
path: BASE_PATH,
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
ApplicationId,
Authorization
}
};
Accept
ヘッダーを追加すると、問題が発生します。エラーが発生しました:
TypeError [ERR_INVALID_HTTP_TOKEN]: Header name must be a valid HTTP token ["Accept"]
at ClientRequest.setHeader (_http_outgoing.js:472:3)
at new ClientRequest (_http_client.js:203:14)
at Object.request (https.js:289:10)
Accept
ヘッダーはどのように無効になりますか?
あなたの質問T_Tのため私は食べませんでした
@hlfrmnが言ったように、あなたのAccept Wordには珍しいcharがあります!!
私はエラーを再現しました:
const https = require('https');
//copied from Origin question
var copiedOptions = {
headers: {
'Content-Type': 'application/json',
"Accept": 'application/json'
}
}
var writedOptions = {
headers: {
'Content-Type': 'application/json',
"Accept": 'application/json'
}
}
https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY',writedOptions, (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
console.log(JSON.parse(data).explanation);
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});
copiedOptionsを使用すると、同じエラーが発生します。
https://github.com/nodejs/node/tree/master およびstackTraceでの検索:_ http_outgoing.js:472
at ClientRequest.setHeader (_http_outgoing.js:472:3)
私はこれを設立しました:
const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/;
/**
* Verifies that the given val is a valid HTTP token
* per the rules defined in RFC 7230
* See https://tools.ietf.org/html/rfc7230#section-3.2.6
*/
function checkIsHttpToken(val) {
return tokenRegExp.test(val);
}
その正規表現は、ヘッダー名に https://tools.ietf.org/html/rfc7230#section-3.2.6 に従ってトークンまたは文字のみが許可されていることを確認します
おそらく、nodejsコアの初期の検証が役立つでしょう:
ヘッダー名に許可されていない文字が含まれています!