【问题标题】:How can I call my REST API get method without hard-coding a URL?如何在不对 URL 进行硬编码的情况下调用我的 REST API 获取方法?
【发布时间】:2015-03-11 12:17:17
【问题描述】:

我正在开发一个 REST API,我的想法是创建一个可以调用此 API 的网站 (Java Webapp),以及一个也将调用该 API 的移动应用程序。

但是,尽管离在线发布上述任何内容(到我自己的域)还差得很远,但我看不到我的应用程序如果部署在我的计算机以外的任何地方会如何工作。

这是因为我在整个商店都有硬编码的“localhost:8080”实例!

例如:

server.xml(我使用的是 Tomcat 8.0.20):

<Engine defaultHost="localhost" name="Catalina">
...
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

SomeClass.java(这是我的 Web 应用程序中的类文件之一,不是我的 REST API)

final WebResource webResource = client.resource( "http://localhost:8080/api/get" );

以上 WebResource 来自 Jersey Client 1.8 依赖项,需要硬编码 URL 才能在指定路径访问我的 API。

这一切在本地都可以正常工作,但是当我将 API/Webapp 部署到生产环境时,这肯定会停止工作,对吧?

我想我在这里寻找三种解决方案之一:

  1. 一些实现允许我使用相对路径访问我的 REST API(例如,我只需要指定“/api/get”)。我计划在生产中将 API 和 Webapp 部署在同一个域上,所以我认为这不会是一个问题(?)
  2. 某种动态确定适当基本 URL 的方法,无论我在什么环境中部署应用程序,该方法都可以工作
  3. 任何其他可以使我的应用程序在这方面防弹的建议

我尝试使用选项 2

HttpServletRequest.getRequestURL()

虽然它返回正确的路径(至少在本地 - http://localhost:8080),但我不断收到以下异常:

com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The element type "hr" must be terminated by the matching end-tag "</hr>".

所以我暂时不使用这种方法。

感谢任何帮助。

谢谢:)

【问题讨论】:

  • 该异常似乎与您的 URL 问题无关 - 查看堆栈跟踪以了解它的来源。
  • 这是异常中唯一的一行(没有任何痕迹,看起来好像被抑制了)。无论如何,我的 HTML/XSL 文件实际上都不包含
    元素。我的研究告诉我,这个异常是由导致 XML 格式不正确的中断响应引起的
  • 好吧,如果没有堆栈跟踪,这听起来像是某个地方存在诊断问题 - 根本不清楚您在哪里看到该异常。
  • 当我尝试在本地访问在 Tomcat 中运行的 API 时,该异常显示在我的控制台中。无论如何,我不是在寻求异常问题的解决方案,我更感兴趣的是在我的应用程序中随处可见硬编码“localhost”的替代方案,以准备有一天使用它
  • 嗯,我通常喜欢在继续下一个错误之前了解一个错误,但是......基本上你会希望能够拥有不同的配置文件。例如,Spring 应该让你有一个属性文件来加载配置——在本地运行时你可以使用 localhost,而在其他时候你可以使用生产 URL。

标签: java spring rest tomcat jersey


【解决方案1】:

为了调用标准 Web 服务或 REST API,您需要在 Internet 上发布您的应用程序。

这意味着您不能使用 localhost,您需要一个可以从所有使用您的 API 的移动或 Web 应用程序访问的 EndPoint。

此端点是您在客户端中编写的内容

client.resource("http://www.myApi.org/api/get");

并且这个基本 URL (www.myApi.org) 必须被所有使用您的 API 的客户端知道。

【讨论】:

  • 我喜欢这个答案,但是如何在本地测试呢?
  • 要在本地进行测试,您可以根据您的项目做几件事。基于一个带有 Tomcat 服务器的应用程序和一个 Android 应用程序来测试它,如果我是你,我会在本地有一个服务器,我将生成一个特殊的 android apk 来用你的本地端点测试本地化。测试完所有内容后,我将拥有带有测试代码的生产服务器,以及带有生产端点的最终 android apk。
  • 那么有没有办法避免重复呢?附言对不起,我不能投票给你的答案,显然我没有足够的声誉......
  • 是的,您只能根据自己的声誉来检查答案是否正确。
  • 您可以做的另一个选择是在您的代码中硬编码这两个 URL,如果 localhost 连接失败,请检查代码并尝试使用您的服务器连接。但是不要害怕应用程序复制,因为通常会创建不同版本的产品来开发和生产环境。有 apache ant 或 apache maven 等工具可以帮助您创建这些版本,这在应用程序生命周期中是正常的。
猜你喜欢
  • 2018-08-18
  • 1970-01-01
  • 2011-11-10
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2023-01-12
  • 2012-01-22
相关资源
最近更新 更多