Google App Engine на Silverlight - PullRequest
       12

Google App Engine на Silverlight

7 голосов
/ 20 марта 2009

Есть ли хорошие примеры использования Google App Engine из Silverlight, желательно без написания пользовательских веб-сервисов?

Приветствия

Nik

Ответы [ 5 ]

2 голосов
/ 13 июля 2009

Вот мой подход, в значительной степени основанный на пост Скотта Сили Просто передает XML, .xap также обслуживается GAE. Я только вчера получил эту работу, так что она все еще в работе.

Google:

app.yaml

    application: wowbosscards
version: 1
runtime: python
api_version: 1

handlers:
- url: /WowBossCards.html
  static_files: WowBossCards.html
  upload: WowBossCards.html
  mime_type: text/html
- url: /clientaccesspolicy.xml
  static_files: clientaccesspolicy.xml
  upload: clientaccesspolicy.xml
  mime_type: text/xml
- url: /WowBossCards.xap
  static_files: WowBossCards.xap
  upload: WowBossCards.xap
  mime_type: application/x-silverlight-app
- url: .*
  script: wowbosscards.py

wowbosscards.py

#!/usr/bin/env python

import cgi
import datetime
import wsgiref.handlers
import os
import logging
import string
import urllib

from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template

class Xml(db.Model):
  xmlContent = db.TextProperty()
  date = db.DateTimeProperty(auto_now_add=True)


class XmlCrud(webapp.RequestHandler):
  def get(self, xmlType):

    xmlKey = string.capitalize(xmlType)
    xml = Xml.get_by_key_name(xmlKey)
    self.response.headers['Content-Type'] = "application/xml"

    self.response.out.write(xml.xmlContent)

  def post(self, xmlType):

    logging.debug("XmlCrud POST")
    xmlKey = string.capitalize(xmlType)
    xml = Xml.get_by_key_name(xmlKey)
    if len(self.request.get('content')) > 0 :
        xml.xmlContent = self.request.get('content')
    else:
        xml.xmlContent = self.request.body
    xml.put()

    self.redirect('/upload/' + xmlType)


def main():
  Xml.get_or_insert("Bosses", xmlContent="<a>Bosses go here</a>")
  Xml.get_or_insert("Dungeons", xmlContent="<a>Dungeons go here</a>")
  application = webapp.WSGIApplication([
                                          (r'/xml/(.*)', XmlCrud),
                                        ], debug=True)
  wsgiref.handlers.CGIHandler().run(application)


if __name__ == '__main__':
  main()

Silverlight:

private class RequestExtended
{
    public VoidCall CallBack;
    public WebRequest Request;
    public Uri Host;

    public RequestExtended(WebRequest request, VoidCall callBack, Uri host)
    {
        Request = request;
        CallBack = callBack;
        Host = host;
    }
}

public static void ImportFromGoogle(Uri host, VoidCall callBack)
{
    try
    {
        if (host.Host == "localhost")
        {
            host = new Uri(host.Scheme + @"://" + host.Host + ":8080");
        }
        var bossesCrud = new Uri(host, "/xml/bosses");
        var bossesRequest = WebRequest.Create(bossesCrud);
        bossesRequest.BeginGetResponse(BossesResponse, new RequestExtended(bossesRequest, callBack, host));
    }
    catch (Exception ex)
    {

    }
}

public static void BossesResponse(IAsyncResult result)
{
    var requestExtended = result.AsyncState as RequestExtended;
    try
    {
        WebResponse response = requestExtended.Request.EndGetResponse(result);
        Stream responseStream = response.GetResponseStream();

        byte[] bytes = new byte[response.ContentLength];
        responseStream.Read(bytes, 0, bytes.Length);
        responseStream.Close();

        var enc = new System.Text.UTF8Encoding();
        string xml = enc.GetString(bytes, 0, bytes.Length);

        bosses = GetCollectionFromXmlString<BossCollection>(xml);

        if (requestExtended.CallBack != null) requestExtended.CallBack();
    }
    catch (WebException we)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        response.Close();
    }
    catch (Exception e)
    {
    }
}




public static void SaveBossesToGoogle(Uri host)
{
    if (host.Host == "localhost")
    {
        host = new Uri(host.Scheme + @"://" + host.Host + ":8080");
    }
    var bossesCrud = new Uri(host, "/xml/bosses");
    var request = WebRequest.Create(bossesCrud);
    request.Method = "POST";
    request.ContentType = "text/xml"; //"application/x-www-form-urlencoded";

    request.BeginGetRequestStream(GetSaveBossesRequestStreamCallback, new RequestExtended(request, null, host));
}

static void GetSaveBossesRequestStreamCallback(IAsyncResult result)
{
    var requestExtended = result.AsyncState as RequestExtended;
    try
    {
        Stream stream = requestExtended.Request.EndGetRequestStream(result);
        var xmlSerializer = new XmlSerializer(typeof(BossCollection));
        var xmlText = new StringBuilder();

        using (TextWriter textWriter = new StringWriter(xmlText))
        {
            xmlSerializer.Serialize(textWriter, Store.Bosses);
            textWriter.Close();
        }

        var enc = new System.Text.UTF8Encoding();
        var bytes = enc.GetBytes(xmlText.ToString());

        stream.Write(bytes, 0, bytes.Length);
        stream.Close();
        requestExtended.Request.BeginGetResponse(SaveResponse, requestExtended);
    }
    catch (WebException we)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        response.Close();
    }
}


static void SaveResponse(IAsyncResult result)
{
    var requestExtended = result.AsyncState as RequestExtended;
    try
    {
        WebResponse response = requestExtended.Request.EndGetResponse(result);
        if (requestExtended.CallBack != null) requestExtended.CallBack();
    }
    catch (WebException we)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        response.Close();
    }
}
1 голос
/ 02 августа 2009

Я не смог найти примеров, чтобы Silverlight работал с Java SDK приложения Google, поэтому вот мой пост .

1 голос
/ 28 марта 2009

Я тоже смотрю на это. Есть несколько проектов REST для GAE, я еще не пробовал ни одного из них, но надеюсь на следующей неделе или около того.

http://code.google.com/p/app3/

http://code.google.com/p/gae-json-rest/

http://code.google.com/p/appengine-rest-server/

1 голос
/ 21 марта 2009

Я думаю о том же, но пока ничего не встречал.

Я думаю об использовании JSON.net для связи, поэтому в основном пишу службу REST в GAE для вызова клиента и, возможно, OAuth.NET для аутентификации (если я не могу найти порт .NET Google один, я еще не посмотрел)

Silverlight - это в основном просто .NET, хотя и облегченная версия, поэтому, если вы можете найти код .NET для чего-то, он должен работать, по крайней мере, в SL:)

Но это все, что я имею - думать об этом. Извините, больше не могу помочь!

0 голосов
/ 08 июля 2009

Скачать демоверсию для Expression Blend . Просмотрите прилагаемое руководство, в котором показано, как создать великолепный интерфейс Silverlight в режиме графического интерфейса пользователя и интегрировать его с веб-службой поиска Bing. Манипулирование этим примером в примере Google должно быть тривиальным. Удачи! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...