Ikai-

Thank you for the great hint, it is good to know the right track.

Still hoping for another hint.  I looked at the Python code (below),
and would like to somehow port it to Java, but have no idea where to
begin.

Really, I only need to read the Simple DB data in my Google App Engine
App.

Conceptually, I just need a little help.  Would the following code be
the way you would return simpleDB data in XML form (as the "message"
below)--can you wrap all the query in the URL like this?

Also, is this limited to 1 MB responses?  I am unclear on the Google
Documentation--sometimes it refers to a 1MB response limit, and
sometimes a 10MB response limit.


URL url = new URL("https://sdb.amazonaws.com/
?Action=GetAttributes
&AWSAccessKeyId=[valid access key id]
&DomainName=MyDomain
&ItemName=JumboFez
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&Timestamp=2010-01-25T15%3A03%3A07-07%3A00
&Version=2009-04-15
&Signature=[valid signature]");

            HttpURLConnection connection = (HttpURLConnection)
url.openConnection();
            connection.setDoOutput(true);
            connection.setRequestMethod("POST");

            OutputStreamWriter writer = new
OutputStreamWriter(connection.getOutputStream());
            writer.write("message=" + message);
            writer.close();

            if (connection.getResponseCode() ==
HttpURLConnection.HTTP_OK) {
                // OK
            } else {
                // Server returned HTTP error code.
            }





PYTHON code below:
import cgi
import logging

from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
from google.appengine.api import datastore_types
from google.appengine.api import memcache
import os
from google.appengine.ext.webapp import template

class MainPage(webapp.RequestHandler):
  def get(self):
    items_query = Item.all().order('-date')
    items = items_query.fetch(10)

    template_values = {
      'items': items,
      }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))

class Edit(webapp.RequestHandler):
  def get(self):
    key = str(self.request.get('key'))
    item = db.get(key)

    template_values = {
      'item': item
      }

    path = os.path.join(os.path.dirname(__file__), 'edit.html')
    self.response.out.write(template.render(path, template_values))


class Put(webapp.RequestHandler):
  def handle(self):
    self.response.headers['Content-Type'] = 'text/plain'

    ui = str(self.request.get('ui'))
    key = str(self.request.get('key'))
    content = self.request.get('content')

    if not content or len(content) == 0:
      if ui:
        self.redirect('/')
      else:
        self.response.out.write(key)
      return

    item = Item()
    try:
      item = db.get(key)
    except datastore_types.datastore_errors.BadKeyError:
      logging.debug("Could not find key %s" % key)
    item.content = self.request.get('content')
    item.put()
    key = str(item.key())
    memcache.set(key, item)


    if ui:
      self.redirect('edit?key=%s' % key)
    else:
      self.response.out.write(key)

  def get(self):
    self.handle()
  def post(self):
    self.handle()

class Get(webapp.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'

    key = str(self.request.get('key'))
    item = memcache.get(key)
    if item is None:
      try:
        item = db.get(key)
        memcache.set(key, item)
      except:
        logging.error("Could not find key %s" % key)
    if item is not None:
      self.response.out.write(item.content)
    else:
      self.response.out.write("")


class Item(db.Expando):
  content = db.StringProperty(multiline=True)
  date = db.DateTimeProperty(auto_now_add=True)

application = webapp.WSGIApplication(
                                     [('/', MainPage),
 
('/edit', Edit),
 
('/get', Get),
 
('/put', Put)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()
Hide details
Change log
r4 by talsalmona on Oct 18, 2008   Diff
[No log message]
Go to:
Older revisions
 r2 by talsalmona on Oct 18, 2008   Diff
All revisions of this file
File info
Size: 2792 bytes, 107 lines
View raw file


On Apr 10, 8:06 am, "Ikai L (Google)" <[email protected]> wrote:
> The reason this code isn't working is because it's build on top of Apache
> Commons HttpClient. You'll need to use URL and URLConnection to make your
> REST calls instead.
>
> This is definitely possible, as people have created a Python library for
> doing this:
>
> http://code.google.com/p/appengine-simpledb/source/browse/#svn/trunk
>
> You're using Java. I haven't seen anything in my searches for examples
> making SimpleDB calls in Java (probably because developers just use App
> Engine's datastore for persistence). You'll likely have to roll your own
> client against the REST spec:
>
> http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuid...
>
>
>
>
>
> On Fri, Apr 9, 2010 at 2:41 PM, deuce4 <[email protected]> wrote:
> > I tried with this
> >        //below gives error: java.lang.NoClassDefFoundError: org/apache/
> > commons/httpclient/HttpMethod
>
> > //        AmazonSimpleDB sdb = new AmazonSimpleDBClient(new
> > PropertiesCredentials(
> > //
> > ClockServlet.class.getResourceAsStream("AwsCredentials.properties")));
> > //
> > //
> > System.out.println("===========================================");
> > //        System.out.println("Getting Started with Amazon SimpleDB");
> > //
> > System.out.println("===========================================\n");
> > //
> > //
> > //            // Create a domain
> > //            String myDomain = "MyStore";
> > //            System.out.println("Creating domain called " + myDomain
> > + ".\n");
> > //            sdb.createDomain(new CreateDomainRequest(myDomain));
> > //
> > //            // List domains
> > //            System.out.println("Listing all domains in your account:
> > \n");
> > //            for (String domainName :
> > sdb.listDomains().getDomainNames()) {
> > //                System.out.println("  " + domainName);
> > //            }
> > //            System.out.println();
>
> > I don't have the URL fetch code attempt anymore--mostly I have the
> > fundamental question of how to create a custom connection object like
> > the sdb above into a Google App Engine URL Fetch connection object.
>
> > I'm a novice with Google App Engine
>
> > Any specific help would be super appreciated in connecting a Amazon
> > SImpleDB to a Java Servlet in Google App Engine.
>
> > thanks
>
> > On Apr 10, 7:10 am, deuce4 <[email protected]> wrote:
> > > On Apr 9, 3:23 pm, deuce4 <[email protected]> wrote:
>
> > > > Is there any elegant way to access data stored in Amazon's Simple DB
> > > > from a Google
> >  application?
>
> > > > I tried using URLfetch, but failed.  Any ideas?
>
> > > I suppose I am new at this, and wasn't able to get the libraries
> > > working.  Any chance of seeing an outline of the process from someone
> > > who is knowledgable in accessing outside data?
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "Google App Engine" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected]<google-appengine%2Bunsubscrib 
> > [email protected]>
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/google-appengine?hl=en.
>
> --
> Ikai Lan
> Developer Programs Engineer, Google App 
> Enginehttp://googleappengine.blogspot.com|http://twitter.com/app_engine

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to