Как получить конечную точку сервера в работающем приложении flex? - PullRequest
5 голосов
/ 08 апреля 2009

Мне нужен способ получения активного адреса сервера, порта и контекста во время выполнения из моего приложения Flex. Поскольку мы используем ant для нашего процесса сборки, информация о соединении с сервером динамически указывается в нашем файле свойств сборки, а заполнители {server.name}, {server.port} и {context.root} используются в services-config XML-файл вместо фактических значений.

У нас есть некоторые другие сервлеты Java, работающие на том же компьютере, что и наш сервер blazeDS, и я хотел бы каким-то образом программно определить информацию о конечной точке сервера, чтобы мне не нужно было жестко кодировать URL сервлета в файл XML это то, что мы делаем в настоящее время).

Я обнаружил, что по крайней мере могу получить корневой контекст, добавив в наш основной файл MXML следующее:

<mx:Application ... >
  <mx:HTTPService id="contextRoot" rootURL="@ContextRoot()"/>
</mx:Application>

Однако мне все еще нужен какой-то способ получения адреса сервера и порта, и если я укажу весь адрес, указав -context-root = http://myserver.com:8080/mycontext,, тогда приложение flex попытается подключиться к http://localhost/http://myserver.com:8080/mycontext/messagebroker/amf, что, конечно, совершенно неправильно. Как правильно указать корневой контекст и URL-адрес сервера и как я могу получить их из нашего приложения?

Ответы [ 6 ]

3 голосов
/ 15 апреля 2009

Мы используем подкласс Application, который предлагает следующие методы:

 /**
  * The URI of the AMF channel endpoint. <br/>
  * Default to #rootURI + #channelEndPointContext + #this.channelEndPointPathInfo
  */
 public function get channelEndPointURI() : String
 {
    return this.rootServerURI + ( this.channelEndPointContext ? this.channelEndPointContext : "" ) + this.channelEndPointPathInfo
 }

 /**
  * The root URI (that is scheme + hierarchical part) of the server the application
  * will connect to. <br/>
  * If the application is executing locally, this is the #localServerRootURI. <br/>
  * Else it is determined from the application #url. <br/>
  */ 
 public function get rootServerURI() : String
 {
      var result : String = ""
      if ( this.url && ( this.url.indexOf("file:/") == -1 ) )
      {
           var uri : URI = new URI( this.url )
           result = uri.scheme + "://" + uri.authority + ":" + uri.port
      }
      else
      {
           result = this.localServerRootURI
      }

      return result 
 }

Это универсальное приложение поддерживает свойства channelEndPointContext, channelEndPointPathInfo и localServerRootURI (как правило, "mycontext" и "/ messagebroker / amf /" в вашем примере, корень локального сервера используется, когда приложение выполняется через Flex Builder, в таких случаях он имеет file:// URL).
Определение полного URI конечной точки затем выполняется с использованием либо свойства localServerRootURI, либо с использованием приложения url, поскольку наши сервисы предоставляются тем же сервером, который обслуживает SWF приложения (что, насколько я понимаю, ваш случай тоже).

Итак, в вашем примере можно написать:

 <SuperApplication ...> <!-- SuperApplication is the enhanced Application subclass -->
    <mx:HTTPService id="myHTTPService" url="{this.channelEndPointURI}"/>
 </SuperApplication>

Начиная с этого момента, вы также можете автоматически определять channelEndPointContext из URL-адреса приложения вместо его жесткого кодирования, как показано в этом примере.

2 голосов
/ 21 сентября 2011
var url:String = (FlexGlobals.topLevelApplication as Application).url 
            //var fullURL:String = mx.utils.URLUtil.getFullURL(url, url);

            var serverName:String = mx.utils.URLUtil.getServerNameWithPort(url);
            listContents.url = mx.utils.URLUtil.getProtocol(url)+"://"+serverName+"/custom_message.html";
            //isSecure = mx.utils.URLUtil.isHttpsURL(url);   

            //pageURL = pageURL.substring(0, pageURL.indexOf("/"));
            listContents.send();
2 голосов
/ 17 апреля 2009

Я использовал FlashVars для успешной передачи URL-адресов. В вашем шаблоне html:

var rootURL = location.href.substring(0,location.href.indexOf("flexBin"));    
...

AC_FL_RunContent(
    "src", "${swf}",
    "FlashVars", "rootURL="+rootURL,
    "width", "${width}",
...

А затем в flex:

service.rootURL = Application.application.parameters.rootURL;

Приятно, что вы действительно можете передавать с сервера все, что захотите, таким образом.

1 голос
/ 01 ноября 2010

Нет необходимости делать всю эту тяжелую работу. Просто используйте URLUtil, предоставленный самой платформой Flex;)

1 голос
/ 13 апреля 2009

Вы можете использовать BrowserManager для получения информации об URL.

var bm:IBrowserManager = BrowserManager.getInstance();
bm.init(Application.application.url);
var url:String = bm.base;

см. Также http://livedocs.adobe.com/flex/3/html/deep_linking_7.html#251252

1 голос
/ 08 апреля 2009

Почему бы не вызвать функцию javascript в оболочке через ExternalInterface, чтобы вернуть значение location.hostname?

<mx:Script>
    <![CDATA[
        private var hostname:String;

        private function getHostName():void
        {
            hostname = ExternalInterface.call(getHostName);
        }
    ]]>
</mx:Script>

JavaScript в оболочке:

<script type="text/javascript">
    function getHostName()
    {
        return location.hostname;
    }
</script>
...