使用绝对 url 前缀获取

Posted

技术标签:

【中文标题】使用绝对 url 前缀获取【英文标题】:Fetch with absolute url prefix 【发布时间】:2017-07-17 04:26:40 【问题描述】:

大多数情况下,我会在 fetch 或 node-fetch 前加上 http://localhost(使其成为绝对网址)。

import fetch from 'node-fetch';

fetch('http://localhost/whatever')

除了简单地将localhost 放在变量中之外,还有什么方法可以避免localhost 部分?

const baseUrl = 'http://localhost';

fetch(`$baseUrl/whatever`)

与Superagent with absolute url prefix非常相关

【问题讨论】:

【参考方案1】:

TL;DR: fetch-absolute 正是这样做的。

详细说明:

您可以在fetch 之上创建一个抽象层。

function fetchAbsolute(fetch) 
  return baseUrl => (url, ...otherParams) => url.startsWith('/') ? fetch(baseUrl + url, ...otherParams) : fetch(url, ...otherParams)

或者你可以简单地使用fetch-absolute。

const fetch = require('node-fetch');
const fetchAbsolute = require('fetch-absolute');

const fetchApi = fetchAbsolute(fetch)('http://localhost:3030');

it('should should display "It works!"', async () => 
  const response = await fetchApi('/');
  const json = await response.json();
  expect(json).to.eql( msg: 'It works!' );
);

【讨论】:

【参考方案2】:

您可以覆盖fetch 函数:

import origFetch from 'node-fetch';

const fetch = (url, ...params) => 
  if (url.startsWith('/')) return origFetch('http://localhost' + url, ...params)
  else return origFetch(url, ...params);

另一个答案创建一个函数,该函数返回一个返回函数的函数——这不是必需的;你只需要返回一个函数。

function fetchAbsolute(fetch, base_url) 
  return (url, ...params) => 
    if (url.startsWith('/')) return fetch(base_url + url, ...params)
    else return fetch(url, ...params);
  


const fetch = fetchAbsolute(origFetch, 'http://localhost');

【讨论】:

以上是关于使用绝对 url 前缀获取的主要内容,如果未能解决你的问题,请参考以下文章

如何在生产中获取绝对 URL?

如何从 django 视图中的绝对 url 获取相对 url?

从相对 URL 获取绝对 URL。 (IE6问题)

如何从 Django QuerySet 中获取绝对图像 URL 列表?

如何从 ExternalContext 获取 webapp 的绝对 URL?

PHP:从绝对 URL 获取绝对路径