• 使用SAP云平台 + JNDI访问Internet Service


    以Internet Service http://maps.googleapis.com/maps/api/distancematrix/xml?origins=Walldorf&destinations=Berlin为例,

    在浏览器里访问这个url,得到输出:从Walldorf到Berlin的距离。

    如何让一个部署到SAP云平台的Java应用也能访问到该internet service呢?

    首先在SAP云平台里创建一个destination,维护service的end point:

    在Java代码里使用SAP云平台里创建的destination:

    然后使用JNDI service读取destination里配置的url:

    部署到SAP云平台之后,在Eclipse里看到preview结果:

    SAP云平台Cockpit显示如下:

    浏览器访问如下:

    web.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        id="WebApp_ID" version="2.5">
    
        <!-- Main sample servlet mapped to / so that the integration test harness can detect readiness (generic for all samples) -->
        <servlet>
            <servlet-name>ConnectivityServlet</servlet-name>
            <servlet-class>com.sap.cloud.sample.connectivity.ConnectivityServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ConnectivityServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
        <!-- Declare the JNDI lookup of destination -->
        <resource-ref>
        <res-ref-name>connectivityConfiguration</res-ref-name>
        <res-type>com.sap.core.connectivity.api.configuration.ConnectivityConfiguration</res-type>
        </resource-ref>
    </web-app>
    
    package com.sap.cloud.sample.connectivity;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.InetSocketAddress;
    import java.net.Proxy;
    import java.net.URL;
    
    import javax.annotation.Resource;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.sap.cloud.account.TenantContext;
    import com.sap.core.connectivity.api.configuration.ConnectivityConfiguration;
    import com.sap.core.connectivity.api.configuration.DestinationConfiguration;
    
    public class ConnectivityServlet extends HttpServlet {
        @Resource
        private TenantContext  tenantContext;
    
        private static final long serialVersionUID = 1L;
        private static final int COPY_CONTENT_BUFFER_SIZE = 1024;
        private static final Logger LOGGER = LoggerFactory.getLogger(ConnectivityServlet.class);
    
        private static final String ON_PREMISE_PROXY = "OnPremise";
    
        @Override
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            HttpURLConnection urlConnection = null;
            String destinationName = request.getParameter("destname");
    
            if (destinationName == null) {
                destinationName = "google_map";
            }
            
            try {
                Context ctx = new InitialContext();
                ConnectivityConfiguration configuration = (ConnectivityConfiguration) ctx.lookup("java:comp/env/connectivityConfiguration");
    
                DestinationConfiguration destConfiguration = configuration.getConfiguration(destinationName);
    
                if (destConfiguration == null) {
                    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                            String.format("Destination %s is not found. Hint:"
                                    + " Make sure to have the destination configured.", destinationName));
                    return;
                }
    
                String value = destConfiguration.getProperty("URL");
                URL url = new URL(value + "xml?origins=Walldorf&destinations=Paris");
    
                String proxyType = destConfiguration.getProperty("ProxyType");
                Proxy proxy = getProxy(proxyType);
    
                urlConnection = (HttpURLConnection) url.openConnection(proxy);
    
                injectHeader(urlConnection, proxyType);
    
                InputStream instream = urlConnection.getInputStream();
                OutputStream outstream = response.getOutputStream();
                copyStream(instream, outstream);
            } catch (Exception e) {
                String errorMessage = "Connectivity operation failed with reason: "
                        + e.getMessage()
                        + ". See "
                        + "logs for details. Hint: Make sure to have an HTTP proxy configured in your "
                        + "local environment in case your environment uses "
                        + "an HTTP proxy for the outbound Internet "
                        + "communication.";
                LOGGER.error("Connectivity operation failed", e);
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
                        errorMessage);
            }
        }
    
        private Proxy getProxy(String proxyType) {
            Proxy proxy = Proxy.NO_PROXY;
            String proxyHost = null;
            String proxyPort = null;
    
            if (ON_PREMISE_PROXY.equals(proxyType)) {
                // Get proxy for on-premise destinations
                proxyHost = System.getenv("HC_OP_HTTP_PROXY_HOST");
                proxyPort = System.getenv("HC_OP_HTTP_PROXY_PORT");
            } else {
                // Get proxy for internet destinations
                proxyHost = System.getProperty("https.proxyHost");
                proxyPort = System.getProperty("https.proxyPort");
            }
    
            if (proxyPort != null && proxyHost != null) {
                int proxyPortNumber = Integer.parseInt(proxyPort);
                proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPortNumber));
            }
    
            return proxy;
        }
    
        private void injectHeader(HttpURLConnection urlConnection, String proxyType) {
            if (ON_PREMISE_PROXY.equals(proxyType)) {
                // Insert header for on-premise connectivity with the consumer account name
                urlConnection.setRequestProperty("SAP-Connectivity-ConsumerAccount",
                        tenantContext.getTenant().getAccount().getId());
            }
        }
    
        private void copyStream(InputStream inStream, OutputStream outStream) throws IOException {
            byte[] buffer = new byte[COPY_CONTENT_BUFFER_SIZE];
            int len;
            while ((len = inStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, len);
            }
        }
    }
    

    要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

  • 相关阅读:
    [Dynamic Language] Python Django: 模板引擎(3)模板标签和过滤器
    [Linux] Ubuntu: 登陆界面无法输入密码
    [Dynamic Language] Python Exec & Compile
    [Dynamic Language] Python: 类基本结构和继承
    [Linux] VIM 代码折叠
    [Database] MongoDB (2) 高级查询条件操作符
    [Dynamic Language] Python: unindent does not match any outer indentation level
    [Linux] VMware 配置linux后出现提示:Failed to initialize remote display subsystem
    [Database] Redis (2) redispy API Reference
    [Database] MongoDB (1) 基本连接、操作、查询
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/9029190.html
Copyright © 2020-2023  润新知