У меня есть приложение 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();
}
}
}
У меня возникли три проблемы, которые не позволяют мне строить, и я не могу понять, исправить: 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
Я понял, пуля # 2 выше, используя URLConnection от java.net. Все еще работает на # 1 и # 3. – Josh
Я пропустил другую ссылку, связанную с этим кодом. ознакомьтесь с этой ссылкой http://pastebin.com/ndVt3HBu для кода, использующего сервисы. Я надеюсь, что не требуется указывать базовый URL-адрес сервера BI в коде моста. Я буду обновлять вас, если я смогу получить решение для проблемы №1. –