【问题标题】:How can I get a JSONP from a server that serves only JSON?如何从仅提供 JSON 的服务器获取 JSONP?
【发布时间】:2013-06-09 06:12:53
【问题描述】:

我正在用 GWT 编写一个应用程序,它应该从外部服务器获取 JSON。我正在使用JsonpRequestBuilder,但我总是会失败(超时),因为这是一个没有 JSONP 的 JSON。

如果我有自己的服务器,那么我将能够更改响应格式(为 JSONP)。

我可以改变什么来让它工作?

我已经用谷歌浏览器的调试器检查过了,我做到了!得到响应,但不知何故代码落入onFailure 方法,我不能使用响应。

String url = "http://api.mobile.endomondo.com/mobile/api/workout/list?authToken=XXXX";

JsonpRequestBuilder jsonp = new JsonpRequestBuilder();
jsonp.setTimeout(100000);
jsonp.setCallbackParam("callback");
 jsonp.requestObject(url,
     new AsyncCallback<TrainingData>() { // Type-safe!

       @Override
       public void onFailure(Throwable throwable) {
         // Easy to debug! (hopefully)
           Window.alert(throwable.getMessage());
       }
       @Override
       public void onSuccess(TrainingData trd) {
         // Success!
           //Window.alert("JSON obtained");
           Window.alert(trd.getEntries().toString());
         }
       });

编辑现在我开始了

尚未实施跨站点托管模式。查看问题 http://code.google.com/p/google-web-toolkit/issues/detail?id=2079

【问题讨论】:

  • 我们通过运行代理 servlet 为我们所有的外部站点伪造本地位置来修复它。我们在 JBoss 中运行 JEE 应用程序,所以我们使用:github.com/dsmiley/HTTP-Proxy-Servlet
  • 你能在代码上展示一下你是怎么做到的吗? (这样我才能接受你的回答?)
  • 您的“跨站托管模式尚未实现”错误是由于使用了&lt;add-linker name="xs"/&gt;。这与您的第一个问题无关。如果您需要它,请改用&lt;add-linker name="xsiframe"/&gt;(如链接问题所述)
  • @Patryk 我在下面添加了一个示例。您的应用会点击localhost/deployment_root/firstResource/path/to/resource,然后转发到http://targethost:port/and/root/path/path/to/resource...希望对您有所帮助。

标签: java json gwt jsonp httprequest


【解决方案1】:

我们正在使用 maven 和 JBoss 7.2.0。但是,如果您希望/需要,也应该能够在 Tomcat 或其他容器中使用此功能,只需进行最少的更改或无需更改。

我们使用 dsmiley's httpproxy servlet 完成了它:下载并构建它,将其添加到您的 maven 存储库(或者忘记 pom.xml 文件,只需将新构建的 jar 添加到您的库中)。

在我们的 pom.xml 文件中,我们添加一个依赖项:

   <dependency>
      <groupId>org.mitre.dsmiley.httpproxy</groupId>
      <artifactId>smiley-http-proxy-servlet</artifactId>
      <!-- 1.3-SNAPSHOT adds ability to handle spaces in paths, 1.2 works otherwise -->
      <version>1.3-SNAPSHOT</version>
   </dependency>

在您的 web.xml 中添加 servlet 映射:

   <servlet>
      <servlet-name>FirstResourceProxy</servlet-name>
      <servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
      <init-param>
         <param-name>targetUri</param-name>
         <param-value>http://targethost:port/and/root/path</param-value>
      </init-param>
      <init-param>
         <param-name>log</param-name>
         <param-value>true</param-value>
      </init-param>
   </servlet>
   <servlet-mapping>
      <servlet-name>FirstResourceProxy</servlet-name>
      <url-pattern>/firstResource/*</url-pattern>
   </servlet-mapping>

   <servlet>
      <servlet-name>SecondResourceProxy</servlet-name>
      <servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
      <init-param>
         <param-name>targetUri</param-name>
         <param-value>http://targethost:port/and/root/path</param-value>
      </init-param>
      <init-param>
         <param-name>log</param-name>
         <param-value>true</param-value>
      </init-param>
   </servlet>
   <servlet-mapping>
      <servlet-name>SecondResourceProxy</servlet-name>
      <url-pattern>/secondResource/*</url-pattern>
   </servlet-mapping>

【讨论】:

  • 你能解释一下targetUri是什么意思吗?
  • targetUri 是将所有请求从源 (servlet-mapping&gt;url-pattern) 转发到的目标 URI(又名 URL)。所以在这里,对local-deployment/firstResource/foo/bar/blah 的请求将转到http://targethost:port/and/root/path/foo/bar/blah,对local-deployment/secondResource/foo/blah/baz.html 的请求将转到http://targethost:port/and/root/path/foo/blah/baz.html。在实际使用中,第一个和第二个资源可能会转发到不同的targetUris,但这只是一个例子。
猜你喜欢
  • 2013-09-27
  • 2018-04-24
  • 2014-03-10
  • 2014-07-09
  • 2014-08-29
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多