目次
本日、バックエンド インターフェイスにトークン検証が追加されましたが、apipost ディレクトリを使用してパブリック ヘッダーと実行前スクリプトを追加すると、結果が期待と一致しませんでした。apipost公式ドキュメントを参照してください
次のように、トークンで検証する必要があるすべてのディレクトリにパブリック ヘッダーを追加します。
トークンで検証する必要があるすべてのディレクトリに次の実行前スクリプトを追加します。
$.ajax({
url: "http://localhost:8080/user/login",
method: "GET",
headers: {
"content-type": "application/json"
},
timeout: "10000",
data: JSON.stringify({
"account": "my_account",
"password": "my_password"
}),
success: function (response) {
console.log(response.data.token);//打印查看此次登陆获取的token,稍后与变量参数的值比对
apt.variables.set("token", response.data.token);//设置环境变量token为此次返回的token
}
});
予想される結果によると、この 2 か所を設定する限り、apipost を使用してトークン検証が必要なインターフェイスを実行する場合、
実行前スクリプトは、最初にログイン操作を実行し、このログインのトークンを取得して環境変数に保存するために使用されます。その後、ヘッダーのトークン値はこの環境変数トークンの値を取得します。
つまり、通常、トークンはヘッダー内でバックエンドに運ばれ、このトークンは実行されるたびに更新されることが期待されます。
ただし、これら 2 つの実行が構成されている場合、トークン値はまだ { {token}} であり、現在の環境変数を確認するために右側の小さな目を見ると、トークンが存在せず、正常に設定できなかったことを示しています。 ajax リクエストの環境変数。
トークン値が { {token}} のままの 公式ドキュメント の記述は以下の通りで、変数 token はインターフェースから返されたトークンにまだバインドされていないため、そのまま出力されるとのことです。
しかし、ajaxリクエストの後に返されたトークンを変数に明確に設定しましたか?
ajaxでの環境変数の設定が無効な理由については公式ドキュメントには記載が見当たりませんし、公式ドキュメントにもそのようなajaxでの環境変数の設定が記載されています。
そこで、実行前スクリプトを使用してトークン変数を設定する代わりに、次のように、ログイン インターフェイスの実行後スクリプトでトークンを変数に設定します。
apt.globals.set("token", response.json.data.token);
このとき、最初にログインインターフェイスを実行し、このログイン用のトークンを取得し、次にトークン検証が必要なインターフェイスを実行します。実行は成功したため、変数の設定は問題ありませんが、ajax で環境変数を設定する必要があります。効果がありません。
しかし、なぜ ajax リクエストで環境変数が無効に設定されるのでしょうか?
ある夜、遭遇した問題を見て、突然思い出した
ajaxは非同期です。
公式ドキュメントをよく見てみると、ajaxメソッドを実行する際、実行処理中にリクエストが送信された可能性があり、ajaxで設定した変数が追いついていない可能性があると説明に記載されていることがわかりました。その送信速度。
したがって、バージョン 7.0.4 以降では、apipost を await キーワードを使用して同期メソッドに変換することができ、最初に関数が実行され、次にインターフェイスが送信されます。
概要と解決策
Ajax は非同期リクエストであるため、関数が実行されてトークン環境変数が設定されている行に到達する前に、リクエストはすでに送信されているため、トークン値は取得されません。
次に、次のように、ajax リクエストの前に await キーワードを追加して、ajax を同期リクエストに変換し、リクエストを送信する前に環境変数が設定されていることを確認します。
await $.ajax({
url: "http://localhost:8080/user/login",
method: "GET",
headers: {
"content-type": "application/json"
},
timeout: "10000",
data: JSON.stringify({
"account": "my_account",
"password": "my_password"
}),
success: function (response) {
console.log(response.data.token);
apt.variables.set("token", response.data.token);
}
});