質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

13821閲覧

XMLHttpRequest()が相対パスで動く原理がわかりません。

newbie

総合スコア10

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

1グッド

0クリップ

投稿2017/07/09 21:17

編集2017/07/09 21:43

###前提・実現したいこと
あるチュートリアルのコードが理解できないので質問しました。
チュートリアルのURL
https://vladimirponomarev.com/blog/authentication-in-react-apps-jwt

Json Web TokenとPassportを使いログイン機能を実装してあります。
Ajax CallでHTTP Post をする際にURLを指定するときにどうして絶対パスを書かなくてもちゃんとPOSTが行われるのか理解できません。

###チュートリアルから抜粋

const xhr = new XMLHttpRequest(); xhr.open('post', '/auth/login'); //ここです。 xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.responseType = 'json'; xhr.addEventListener('load', () => {

このチュートリアルのclient/src/containers/LoginPage.jsxでログインのPost Http リクエストをするためにURLを指定している部分ですが、どうして絶対パス("http://localhost:3000/api/auth/login")のようにしなくても良いのでしょうか?
XMLHttpRequestはどのようにして"http://localhost:3000/api"の部分を補っているのでしょうか?

###補足情報(
他のチュートリアルを見るとvar loginUrl = "http://localhost:3000/login"のように絶対パスを指定しているのがあるのですが、なぜ相対パスでもPOST リクエストが通るのでしょうか?

ご教授宜しくお願い致します。

nikuatsu👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

相対URI参照の場合は、スキーム、ホスト名、ポート番号は、現在のページをリクエストしたときの物が補完されるのでしょう。

xhr.open('post', '/auth/login'); //ここです。

なお、/から始まっているのは絶対パスですよ。まあ、間違えている人が多数派なので、ここで書いてもしょうが無いですが、「パス」というのはURLの中ではスキーム~ポート番号の後ろの/から始まる部分を指します。

URLの上位のいくつかの要素を省略した物は、「相対URI(相対URL)参照」と呼びます。

RFC2396 Uniform Resource Identifiers (URI): Generic Syntax

  1. Relative URI References

(中略)
A relative reference beginning with a single slash character is

termed an absolute-path reference, as defined by <abs_path> in
Section 3.

一つのスラッシュ文字で開始する相対参照は,絶対パス参照といい,3節で<abs_path>によって定義されたとおりである。

投稿2017/07/09 22:30

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newbie

2017/07/09 22:40

回答ありがとうございます。 絶対パスと相対パスの違いまで教えていただきありがとうございます。 自分の理解が正しいか確認したいのですが、もしこの呼び出そうとしているAPIが別のドメインである場合はスキーム、ホスト名を含めたURLをopen()メソッドに入れるということですよね? 例えばツイッターのAPIにアクセスしたいときはスキーム、ホスト名をURLに入れるといったように。
otn

2017/07/10 21:24

ホスト名は必要ですね。スキームは現在と同じなら省略できます。
guest

0

ベストアンサー

概念的な話と技術的な話で回答が変わってきそうですが、XMLHttpRequest はドキュメントの script タグから作られた物だと理解するとコンテキストがドキュメントとなるので /auth/login というパスとドキュメントのロケーションからアクセスしたいはずの URL は補足できるという事かと思います。

実際には XMLHttpRequest 自体が通信機能を持っているのではなく、ブラウザの機能を使っている訳なので new した際に内部的にドキュメントやロケーションといったコンテキストが参照されているのだと思います。

投稿2017/07/10 00:17

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newbie

2017/07/10 16:00

回答ありがとうございます。 やっと理解するとこが出来ました。webpackで生成されたbundle.jsファイルのディレクトリーからパスを読み取っているということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問