2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

new URLでAPIのパスが消える理由:末尾と先頭のスラッシュをNode.jsで比較実測

2
Posted at

new URL('users', 'https://example.com/api/v1') の結果は、https://example.com/api/users です。v1 は残りません。

AIが書いたAPI呼び出しでは、new URL() を文字列の連結だと思うと、この違いを見落とします。今回は通信せず組み立て結果を比べます。

実測環境:macOS 27.2、Node.js v24.22.1、2026年11月10日。 ブラウザ・Windows・実APIの応答は試していません。各例を別々の .mjs に保存し node ファイル名.mjs で実行しました。

末尾の / がないと最後の区切りが置き換わる

console.log(new URL('users', 'https://example.com/api/v1').href);
console.log(new URL('users', 'https://example.com/api/v1/').href);
https://example.com/api/users
https://example.com/api/v1/users

HTTP(S)のURLで、users のような相対参照を渡すと、基準URLの最後の / までを基準に解決します。末尾が v1 なら、その部分を置き換えます。v1/ なら、その下へ進みます。

これはURLの構文上の扱いで、サーバー上のファイルやフォルダの存在は調べません。

渡す側が /users だと /api/v1/ は残らない

渡す値の先頭でも結果が変わります。

const base = 'https://example.com/api/v1/';
for (const input of ['users', './users', '/users', '../users']) {
  console.log(input, new URL(input, base).href);
}
users https://example.com/api/v1/users
./users https://example.com/api/v1/users
/users https://example.com/users
../users https://example.com/api/users

/users はサイトのルートからの参照です。../users は一段上を基準にします。./users は現在の区切りからなので、今回の users と同じ結果です。

URLを作れたことと、目的のURLになったことは別

例外が出なくても、意図したパスになるとは限りません。完成URLも照合します。

import assert from 'node:assert/strict';

const apiBase = 'https://example.com/api/v1/';
const target = new URL('users', apiBase);
assert.equal(target.href, 'https://example.com/api/v1/users');
console.log(target.href);
https://example.com/api/v1/users

確認できたのは固定文字列からの組み立てだけです。通信の成功や自由入力の安全性は保証しません。

絶対URLを渡すと、基準URLの配下にも制限されません。

console.log(new URL('https://other.example/users',
  'https://example.com/api/v1/').href);
https://other.example/users

自由入力なら送信先の制限は別途必要です。ここでは固定の users を使います。

AIへの修正依頼も、基準URL・渡す値・期待する完成URLを一組で渡すと確認条件が明確になります。

基準は https://example.com/api/v1/、渡す値は users です。完成URLを https://example.com/api/v1/users と照合するコードも示してください。

参考:Node.js公式の new URL(input[, base])、WHATWG URL Standard。


未経験者向けの体験版を公開しています

※ 中上級者には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?