プロキシのアプローチが本当に助けになりました。私のアプリが埋め込まれた桟橋を実行されていると私は、この問題にアプローチするためにProxyServeltを使用:
import java.net.URI;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.UriBuilder;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.proxy.ProxyServlet;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FoursquareProxyServlet extends ProxyServlet {
public static final String FOURSQUARE_API_PREFIX = "foursquare";
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(FoursquareProxyServlet.class);
private static final String FOURSQUARE_API_VERSION = "20141026";
private String apiURL;
private String clientId;
private String clientSecret;
public void init() throws ServletException {
super.init();
ServletConfig config = getServletConfig();
apiURL = config.getInitParameter("foursquare.apiUrl");
clientId = config.getInitParameter("foursquare.clientId");
clientSecret = config.getInitParameter("foursquare.clientSecret");
}
@Override
protected void customizeProxyRequest(Request proxyRequest, HttpServletRequest request) {
proxyRequest.getHeaders().remove("Host");
}
@Override
protected URI rewriteURI(HttpServletRequest request) {
URI uri = UriBuilder.fromUri(this.apiURL)
.path(request.getRequestURI().replaceAll("/foursquare", ""))
.replaceQuery(request.getQueryString().trim())
.queryParam("client_id", this.clientId)
.queryParam("client_secret", this.clientSecret)
.queryParam("v", FOURSQUARE_API_VERSION)
.build();
return uri;
}
protected HttpClient newHttpClient() {
SslContextFactory sslContextFactory = new SslContextFactory();
HttpClient httpClient = new HttpClient(sslContextFactory);
return httpClient;
}
}
その後、あなたは自分のサーバーにプラグインする必要があります。
protected ServletContextHandler createFoursquareProxy() {
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/"+FoursquareProxyServlet.FOURSQUARE_API_PREFIX+"/*");
ServletHolder foursquareProxy = new ServletHolder("foursquare", new FoursquareProxyServlet());
foursquareProxy.setInitParameter("foursquare.apiUrl", this.foursquareApiUrl);
foursquareProxy.setInitParameter("foursquare.clientId", this.foursquareClientId);
foursquareProxy.setInitParameter("foursquare.clientSecret", this.foursquareClientSecret);
context.addServlet(foursquareProxy, "/*");
return context;
}
この場合、あなたの要求は次のようになりますこれは:
GET http://{host}:{port}/foursquare/venues/search?&ll=40.7,-74%20&query=sushi
あなたのスタックに似たようなものを見つけ出すことができると確信しています。
私はプロキシソリューションをやっていますが、十分に安全ですが、 'user - > my-server - > foursquare-api'のために遅いです。 –