2014-10-04 2 views
0

У меня есть приложение Java, которое использует API-интерфейс OBIEE для использования данных с сервера BI. Я очень хорошо разбираюсь в XMLViewService и WebCatalogService, но я не могу заставить HtmlViewService правильно отображать отчет в приложении Java. В отчете просто показан вращающийся загрузчик, но он фактически не отображает отчет. Я уверен, что это связано с тем, что приложение Java и сервер BI находятся в разных доменах. Это то, что говорит документация API:HtmlViewService в API-интерфейсе OBIEE Web-сервисов не является рендерингом (он показывает только вращающийся загрузчик)

В ситуациях, когда веб-службы Oracle BI и сторонний веб-сервер не принадлежат к одному домену службы доменных имен (DNS), пользователи могут получить ошибки JavaScript, связанные с безопасностью браузера ограничения для междоменного скриптинга. Чтобы избежать этих проблем, используйте метод setBridge() для изменения URL-адресов обратного вызова, чтобы указать на сторонний веб-сервер. Имейте в виду, что веб-компонент, выполняемый сторонним веб-сервером для перенаправления запросов к веб-службам Oracle BI, не предоставляется. Эта функция должна выполняться сторонним приложением.

Несколько лет назад я сделал такой же тип интеграции с использованием .NET/C# и столкнулся с той же проблемой, потому что приложение .NET и сервер BI были в разных доменах. В результате мне пришлось создать HTTP-обработчик (файл .ashx), а также использовать метод setBridge() для решения проблемы.

Проблема, с которой я столкнулась, заключается в том, что я не могу найти пример сервлета-моста для Java. И я не слишком уверен в переносе кода .NET/.ASHX на сервлет/мост Java. Есть ли у кого-нибудь какие-либо примеры кода или направление, которое они могут предоставить, чтобы указать мне в правильном направлении? Вот фрагмент кода, чтобы показать вам, что я делаю, чтобы оттянуть данные отчета:

// define report path 
    ReportRef reportRef = new ReportRef(); 
    reportRef.setReportPath(reportFolder + "/" + reportName); 

    // set page params 
    StartPageParams pageParams = new StartPageParams(); 
    pageParams.setDontUseHttpCookies(true); 

    // set report params 
    String pageId = htmlService.startPage(pageParams, sawSessionId); 
    String reportId = pageId + reportName; 
    htmlService.addReportToPage(pageId, reportId, reportRef, null, null, null, sawSessionId); 

    // get report html 
    StringBuffer reportHtml = new StringBuffer(); 
    reportHtml.append(htmlService.getHtmlForReport(pageId, reportId, sawSessionId)); 

    // return html 
    return reportHtml.toString(); 

Это ошибка, которая возвращается в браузере:

XMLHttpRequest не может загрузить http://myobiserver.com/analytics/saw.dll?ajaxGo. В запрошенном ресурсе нет заголовка «Access-Control-Allow-Origin». Origin 'http://myjavaapp.com', следовательно, не допускается.

Пер просил, вот мой .NET/.ashx мост:

using System.Collections.Specialized; 
using System.Net; 
using System.Text; 
using System.Web; 
using System; 
using System.Collections; 
using System.Configuration; 
using System.Collections.Specialized; 
using System.Web; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.Diagnostics; 

/* 
This is a ASP.NET handler that handles communication 
between the SharePoint site and OracleBI. 
It will be deployed to: 
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\OracleBI 
*/ 

public class OracleBridge: IHttpHandler 
{ 
    public bool IsReusable {get{return true;}} 
    public OracleBridge() 
    { 
    } 
    string getServer() 
    { 
     string strServer = "http://<enter-domain>/analytics/saw.dll"; 
    int index = strServer.LastIndexOf("/");//split off saw.dll 
    if (index >=0) 
     return strServer.Substring(0,index+1); 
    else 
     return strServer; 
    } 
    public void ProcessRequest(HttpContext context) 
    { 
    HttpWebRequest req = forwardRequest(context); 
    forwardResponse(context,req); 
    } 
    private HttpWebRequest forwardRequest(HttpContext context) 
    { 
    string strURL = makeURL(context); 
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strURL); 
    req.Method = context.Request.HttpMethod; 
    NameValueCollection headers = context.Request.Headers; 
    req.Accept = headers.Get("Accept"); 
    req.Expect = headers.Get("Expect"); 
    req.ContentType = headers.Get("Content-Type"); 
    string strModifiedSince = headers.Get("If-Modified-Since"); 
    if (strModifiedSince != null && strModifiedSince.Length != 0) 
     req.IfModifiedSince = DateTime.Parse(strModifiedSince); 
    req.Referer = headers.Get("Referer"); 
    req.UserAgent = headers.Get("User-Agent");  
    if (!req.Method.Equals("GET")) 
    { 
     CopyStreams(context.Request.InputStream,req.GetRequestStream()); 
    } 
    return req; 
    } 

    private void forwardResponse(HttpContext context, HttpWebRequest req) 
    { 
    HttpWebResponse resp =null; 
    try 
    { 
     resp = (HttpWebResponse)req.GetResponse(); 
    } 
    catch(WebException e) 
    { 
     resp = (HttpWebResponse)e.Response; 
    } 
    context.Response.StatusCode = (int)resp.StatusCode; 

    for (int i = 0; i < resp.Cookies.Count; i++) 
    { 
     Cookie c = resp.Cookies[i]; 
     HttpCookie hc = new HttpCookie(c.Name, c.Value); 
     hc.Path = c.Path; 
     hc.Domain = getServer(); 
     context.Response.Cookies.Add(hc); 
    } 
    context.Response.ContentType = resp.ContentType; 
    CopyStreams(resp.GetResponseStream(), context.Response.OutputStream); 
    } 


    private string makeURL(HttpContext context) 
    { 
    string strQuery = context.Request.Url.Query; 
    string[] arrParams = strQuery.Split('?','&'); 
    StringBuilder resultingParams = new StringBuilder(); 
    string strURL=null; 
    foreach(string strParam in arrParams) 
    { 
     string[] arrNameValue = strParam.Split('='); 
     if (!arrNameValue[0].Equals("RedirectURL")) 
     { 
      if (strParam.Length != 0) 
      { 
       if (resultingParams.Length != 0) 
       resultingParams.Append("&"); 
       resultingParams.Append(strParam); 
      } 
     } 
     else if (arrNameValue.Length >1) 
      strURL = HttpUtility.UrlDecode(arrNameValue[1]); 
    } 

    if (strURL ==null) 
     throw new Exception("Invalid URL format. requestURL parameter is missing"); 
    String sAppendChar = strURL.Contains("?") ? "&" : "?"; 
    if (strURL.StartsWith("http:") || strURL.StartsWith("https:")) 
    { 
     String tmpURL = strURL + sAppendChar + resultingParams.ToString(); 
     return tmpURL; 
    } 
    else 
    { 
     String tmpURL = getServer() + strURL + sAppendChar + resultingParams.ToString(); 
     return tmpURL; 
    } 
    } 

    private void CopyStreams(Stream inStr,Stream outStr) 
    { 
    byte[] buf = new byte[4096]; 
    try 
    { 
     do 
     { 
      int iRead = inStr.Read(buf,0,4096); 
      if (iRead == 0) 
       break; 
      outStr.Write(buf,0,iRead); 
     } 
     while (true); 
    } 
    finally 
    { 
     outStr.Close(); 
    } 
} 
} 

ответ

0

Используйте ссылку http://pastebin.com/NibVnBLb, чтобы проверить код моста для Java. Надеюсь, это может быть хвалит.

+0

У меня возникли три проблемы, которые не позволяют мне строить, и я не могу понять, исправить: 1) «HttpProxyServlet.getHeaders (запрос, хэш-таблица);» бросает «не может быть решено» 2) «URLConnection httpConnection = urlconn.openConnection();» throwing "не определено для URL-адреса типа" 2) "com.abs.util.GetPost.rewriteHeaders (httpConnection, response);" бросает «не может быть разрешен» ... Наконец, где я могу подключить URL-адрес для базового URL-адреса для сервера BI? (который был «string strServer =» http: // /analytics/saw.dll ";" в исходном коде C#)? Спасибо! – Josh

+0

Я понял, пуля # 2 выше, используя URLConnection от java.net. Все еще работает на # 1 и # 3. – Josh

+0

Я пропустил другую ссылку, связанную с этим кодом. ознакомьтесь с этой ссылкой http://pastebin.com/ndVt3HBu для кода, использующего сервисы. Я надеюсь, что не требуется указывать базовый URL-адрес сервера BI в коде моста. Я буду обновлять вас, если я смогу получить решение для проблемы №1. –