2つのドロップダウンリストコンポーネントで構成される単一のページがあります。このページには、認証が成功した場合にのみアクセスできます(有効なトークン)。両方のドロップダウンリストは、異なるJSON-APIからのデータを消費します。ドロップダウンリストの1つが機能していますが、もう1つは、そのAPIへのURLにパラメーターが必要です。
URLの例: http:// buildingsAPI:111/api/buildings /
IDが追加された郵便配達員を介してテストされました: http:// buildingsAPI:111/api/buildings/abcde-abce-abc2-111- 2222
サンプルJson:
[
{
"abc_buildingid": "1111-2222-3333-aaa-1111117",
"abc_energyprogramid": "abcde-abce-abc2-111-2222",
"siteName": "Building 1",
"Available": false,
"clientName": "Client 1"
},
{
"abc_buildingid": "222-2222-3333-aaa-1111117",
"abc_energyprogramid": "xyz11-abce-abc2-111-2222",
"siteName": "Building 2",
"Available": false,
"clientName": "Client 2"
},
]
...ユーザー認証(localStorage)時にすでにトークンを取得していますが、APIURLにパラメーターとしてabc_energyprogramidを追加/渡す必要もあります。
...コード:
constructor(props) {
super(props);
this.getToken = this.getToken.bind(this);
}
componentDidMount() {
const bearerToken = this.getToken();
fetch('http://buildingsAPI:111/api/buildings/?myparam1={abc_energyprogramid}', {
method: 'GET',
headers: {
'Content-type': 'application/json',
'Authorization': `Bearer ${bearerToken}`
},
})
.then(results => results.json())
.then(buildings => this.setState({ buildings: buildings }))
}
getToken() {
return localStorage.getItem('id_token');
}
render() {
console.log(this.state.buildings);
return(
<div>
<select className="custom-select" id="siteName">
{ this.state.buildings.map(item =>(
<option key={item.siteName}>{item.siteName}</option>
))
}
</select>
</div>
);
}
...現在、次のエラーが発生します: "Unhandled Rejection(SyntaxError):unexpected end of JSON input" on this line of the code:.then(results => results.json())。これについて助けてもらえますか?
問題はあなたが参照している方法だと思いますabc_energyprogramid
これを変える:
fetch('http://buildingsAPI:111/api/buildings/?myparam1={abc_energyprogramid}')
に:
fetch(`http://buildingsAPI:111/api/buildings/?myparam1=${abc_energyprogramid}`)
バックティックとES6テンプレート文字列リテラルに注意してください。