天天看點

Google base的介紹、原理分析與應用執行個體

    這幾天使用Google base釋出了一些東西,感覺用起來很友善而且很有用,關于這方面的部落格現在基本還沒有,這裡就給大家介紹一下Gbase的原理與使用。

    Gbase是一個幫助你發表虛拟類型的任何資訊的免費服務,使用者把資訊釋出到Gbase上,然後可以在google網站上搜尋。這個服務就很有用,我們知道google 的搜尋能力很強大,如果我們把我們的産品或者服務釋出到Gbase上,就有可能讓全世界的人看到我們釋出的資訊。

    釋出一個項目很簡單,前提是必須得有一個google帳戶,有賬戶的使用者步驟如下:

    1.進入google base網站首頁:http://www.google.com/base/

    2.點選“One at a time”,就進入了添加item頁面,或者直接登入進去自己的Gbase首頁,點選左下角“Add a item”按鈕就可以添加item。

    3.填完資訊後,點選“Publish”即可。

    這裡添加的資訊包括item類别(你可以選擇已有的類别,或者自定義一個類别),然後填寫可能包含的數量、金額和描述資訊等等。上述方法是一次添加一個item的方式,如果你想批量添加,可以添加一個本地的xml檔案,該檔案符合google base規定的格式。

    下面介紹如何使用Google base API編寫Gbase應用,主要是給程式開發等程式設計人員提供參考。

    Data item:在Google base 中描述一個單獨的entry,他包含一組屬性。

    Attribute:描述内容的name/pair對,如<code>&lt;g:label&gt;kung pao chicken&lt;/g:label&gt;     一個entry的資訊如下所示:</code>

<code></code><code>&lt;?xml version='1.0'?&gt; &lt;entry xmlns='http://www.w3.org/2005/Atom'         xmlns:g='http://base.google.com/ns/1.0'&gt;         &lt;author&gt;             &lt;name&gt;Jane Doe&lt;/name&gt;             &lt;email&gt;[email protected]&lt;/email&gt;         &lt;/author&gt;         &lt;category scheme='http://www.google.com/type' term='googlebase.item'/&gt;         &lt;title type='text'&gt;He Jingxian's chicken&lt;/title&gt;         &lt;content type='xhtml'&gt;             &lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Delectable Sichuan specialty&lt;/div&gt;         &lt;/content&gt;         &lt;link rel='alternate' type='text/html' href='http://www.host.com/123456jsh9'/&gt;         &lt;g:item_type&gt;Recipes&lt;/g:item_type&gt;         &lt;g:cooking_time&gt;30&lt;/g:cooking_time&gt;         &lt;g:main_ingredient&gt;chicken&lt;/g:main_ingredient&gt;         &lt;g:main_ingredient&gt;chili peppers&lt;/g:main_ingredient&gt;         &lt;g:main_ingredient&gt;peanuts&lt;/g:main_ingredient&gt;         &lt;g:spices_used&gt;Szechuan peppercorn&lt;/g:spices_used&gt;         &lt;g:cook_technique&gt;blackened&lt;/g:cook_technique&gt; &lt;/entry&gt;</code>

<code></code>

<code>    每一個item都有一個URL,或者說一個唯一的ID,用于辨別這個item或者說entry,比我添加的一條記錄的URL如下所示:     http://base.google.com/base/feeds/items/2139682888944988653     item ID是</code><code>2139682888944988653。     這個URL一般是程式代碼中使用的,item自己生成的URL是http://base.google.com/base/a/6380400/D2139682888944988653,他們的實質都是一樣的。     每一個Googel base API操作跟HTTP方法相同,你可以使用HTTP GET、POST、PUT和DELETE方法來操作。     一個查詢的例子如下所示:</code>

<code>    發送的HTTP請求是:</code>

<code></code><code>GET /base/feeds/snippets?bq=digital+camera Content-Type: application/atom+xml Authorization: AuthSub token="" X-Google-Key: key=ABQIAAAA7VerLsOcLuBYXR7vZI2NjhTRERdeAiwZ9EeJWta3L_JZVS0bOBRIFbhTrQjhHE52fqjZvfabYYyn6A</code>

<code>    由于響應資訊比較多,這裡就不顯示了。     使用API添加item的代碼如下所示。 InsertExample.java代碼:</code>

<code></code><code>/* Copyright (c) 2006 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *         http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cn.edu.xidian; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.StringTokenizer; /** *    Add a new item to Google Base using the Google Base data API server. */ public class InsertExample {     /**      * URL of the authenticated customer feed.      */     private static final String ITEMS_FEED = "http://base.google.com/base/feeds/items";     /**      * The data item we are going to insert, in XML/Atom format.      */     private static final String DATA_ITEM =                  "&lt;?xml version='1.0'?&gt;\n" +                 "&lt;entry xmlns='http://www.w3.org/2005/Atom'\n" +                 "        xmlns:g='http://base.google.com/ns/1.0'&gt;\n" +                 "    &lt;g:item_type type='text'&gt;repaceService&lt;/g:item_type&gt;\n" +                 "    &lt;title type='text'&gt;EchoService_ID&lt;/title&gt;\n" +                 "    &lt;content type='xhtml'&gt;08d8440b82554bad9a7a5ad9a1487&lt;/content&gt;\n" +                 "&lt;/entry&gt;";     /**      * URL used for authenticating and obtaining an authentication token.       * More details about how it works:      * &lt;code&gt;http://code.google.com/apis/accounts/AuthForInstalledApps.html&lt;code&gt;      */     private static final String AUTHENTICATION_URL = "https://www.google.com/accounts/ClientLogin";          /**      * Fill in your Google Account email here.      */     private static final String EMAIL = "[email protected]";          /**      * Fill in your Google Account password here.      */     private static final String PASSWORD = "yourpassword";          /**      * The main method constructs a &lt;code&gt;InsertExample&lt;/code&gt; instance, obtains an       * authorization token and posts a new item to Google Base.      */     public static void main(String[] args) throws MalformedURLException, IOException {         InsertExample insertExample = new InsertExample();         String token = insertExample.authenticate();         System.out.println("Obtained authorization token: " + token);         insertExample.postItem(token);     }     /**      * Inserts &lt;code&gt;DATA_ITEM&lt;/code&gt; by making a POST request to      * &lt;code&gt;ITEMS_URL&lt;code&gt;.      * @param token authentication token obtained using &lt;code&gt;authenticate&lt;/code&gt;      * @throws IOException if an I/O exception occurs while creating/writing/      *                 reading the request      */     public void postItem(String token) throws IOException {         HttpURLConnection connection = (HttpURLConnection)(new URL(ITEMS_FEED)).openConnection();                  connection.setDoInput(true);         connection.setDoOutput(true);                  // Set the properties of the connection: the Http method, the content type         // of the POST request and the authorization header          connection.setRequestMethod("POST");         connection.setRequestProperty("Content-Type", "application/atom+xml");         connection.setRequestProperty("Authorization", "GoogleLogin auth=" + token);         // Post the data item         OutputStream outputStream = connection.getOutputStream();         outputStream.write(DATA_ITEM.getBytes());         outputStream.close();              // Retrieve the output         int responseCode = connection.getResponseCode();         InputStream inputStream;         if (responseCode == HttpURLConnection.HTTP_CREATED) {             inputStream = connection.getInputStream();         } else {             inputStream = connection.getErrorStream();         }                  // write the output to the console         System.out.println(toString(inputStream));              }     /**      * Retrieves the authentication token for the provided set of credentials.      * @return the authorization token that can be used to access authenticated      *                 Google Base data API feeds      */     public String authenticate() {         // create the login request         String postOutput = null;         try {             URL url = new URL(AUTHENTICATION_URL);             postOutput = makeLoginRequest(url);         } catch (IOException e) {             System.out.println("Could not connect to authentication server: "                      + e.toString());             System.exit(1);         }              // Parse the result of the login request. If everything went fine, the          // response will look like         //            HTTP/1.0 200 OK         //            Server: GFE/1.3         //            Content-Type: text/plain          //            SID=DQAAAGgA...7Zg8CTN         //            LSID=DQAAAGsA...lk8BBbG         //            Auth=DQAAAGgA...dk3fA5N         // so all we need to do is look for "Auth" and get the token that comes after it              StringTokenizer tokenizer = new StringTokenizer(postOutput, "=\n ");         String token = null;                  while (tokenizer.hasMoreElements()) {             if (tokenizer.nextToken().equals("Auth")) {                 if (tokenizer.hasMoreElements()) {                     token = tokenizer.nextToken();                  }                 break;             }         }         if (token == null) {             System.out.println("Authentication error. Response from server:\n" + postOutput);             System.exit(1);         }         return token;     }     /**      * Makes a HTTP POST request to the provided {@code url} given the provided      * {@code parameters}. It returns the output from the POST handler as a      * String object.      *       * @param url the URL to post the request      * @return the output from the handler      * @throws IOException if an I/O exception occurs while      *                     creating/writing/reading the request      */     private String makeLoginRequest(URL url)             throws IOException {         // Create a login request. A login request is a POST request that looks like         // POST /accounts/ClientLogin HTTP/1.0         // Content-type: application/x-www-form-urlencoded         // [email protected]&amp;Passwd=north23AZ&amp;service=gbase&amp;source=Insert Example         // Open connection         HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();                       // Set properties of the connection         urlConnection.setRequestMethod("POST");         urlConnection.setDoInput(true);         urlConnection.setDoOutput(true);         urlConnection.setUseCaches(false);         urlConnection.setRequestProperty("Content-Type",                                                                          "application/x-www-form-urlencoded");              // Form the POST parameters         StringBuilder content = new StringBuilder();         content.append("Email=").append(URLEncoder.encode(EMAIL, "UTF-8"));         content.append("&amp;Passwd=").append(URLEncoder.encode(PASSWORD, "UTF-8"));         content.append("&amp;source=").append(URLEncoder.encode("Repace service example", "UTF-8"));         content.append("&amp;service=").append(URLEncoder.encode("gbase", "UTF-8"));         OutputStream outputStream = urlConnection.getOutputStream();         outputStream.write(content.toString().getBytes("UTF-8"));         outputStream.close();              // Retrieve the output         int responseCode = urlConnection.getResponseCode();         InputStream inputStream;         if (responseCode == HttpURLConnection.HTTP_OK) {             inputStream = urlConnection.getInputStream();         } else {             inputStream = urlConnection.getErrorStream();         }              return toString(inputStream);     }     /**      * Writes the content of the input stream to a &lt;code&gt;String&lt;code&gt;.      */     private String toString(InputStream inputStream) throws IOException {         String string;         StringBuilder outputBuilder = new StringBuilder();         if (inputStream != null) {             BufferedReader reader =                     new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));             while (null != (string = reader.readLine())) {                 outputBuilder.append(string).append('\n');             }         }         return outputBuilder.toString();     } }</code>

<code>    如果email和密碼正确,驗證通過,則在你的email帳号下的Gbase下添加了一條item,這個item需要大概1天的時間能夠通過google搜尋。 QueryExample3.java代碼:</code>

<code></code><code>/* Copyright (c) 2006 Google Inc.                                                                                                                                                                                                                                                                                                                                                                 *                                                                                                                                                                                                                                                                                                                                                                                                                             * Licensed under the Apache License, Version 2.0 (the "License");                                                                                                                                                                                                                                                                                             * you may not use this file except in compliance with the License.                                                                                                                                                                                                                                                                                             * You may obtain a copy of the License at                                                                                                                                                                                                                                                                                                                                             *                                                                                                                                                                                                                                                                                                                                                                                                                             *         http://www.apache.org/licenses/LICENSE-2.0                                                                                                                                                                                                                                                                                                                                 *                                                                                                                                                                                                                                                                                                                                                                                                                             * Unless required by applicable law or agreed to in writing, software                                                                                                                                                                                                                                                                                     * distributed under the License is distributed on an "AS IS" BASIS,                                                                                                                                                                                                                                                                                         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.                                                                                                                                                                                                                                                                             * See the License for the specific language governing permissions and                                                                                                                                                                                                                                                                                     * limitations under the License.                                                                                                                                                                                                                                                                                                                                                                 */ package cn.edu.xidian; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.StringTokenizer; /** * Display all items of a specific customer. */ public class QueryExample3 {     /**      * URL of the authenticated customer feed.      */     private static final String ITEMS_FEED = "http://base.google.com/base/feeds/items/2139682888944988653";     /**      * URL used for authenticating and obtaining an authentication token.       * More details about how it works:      * &lt;code&gt;http://code.google.com/apis/accounts/AuthForInstalledApps.html&lt;code&gt;      */     private static final String AUTHENTICATION_URL = "https://www.google.com/accounts/ClientLogin";     /**      * Fill in your Google Account email here.      */     private static final String EMAIL = "[email protected]";          /**      * Fill in your Google Account password here.      */     private static final String PASSWORD = "yourpassword";          /**      * Create a &lt;code&gt;QueryExample3&lt;/code&gt; instance and call      * &lt;code&gt;displayMyItems&lt;/code&gt;, which displays all items that belong to the      * currently authenticated user.      */     public static void main(String[] args) throws IOException {         QueryExample3 queryExample = new QueryExample3();         String token = queryExample.authenticate();         queryExample.displayMyItems(token);     }     /**      * Retrieves the authentication token for the provided set of credentials.      * @return the authorization token that can be used to access authenticated      *                 Google Base data API feeds      */     public String authenticate() {         // create the login request         String postOutput = null;         try {             URL url = new URL(AUTHENTICATION_URL);             postOutput = makeLoginRequest(url);         } catch (IOException e) {             System.out.println("Could not connect to authentication server: "                      + e.toString());             System.exit(1);         }              // Parse the result of the login request. If everything went fine, the          // response will look like         //            HTTP/1.0 200 OK         //            Server: GFE/1.3         //            Content-Type: text/plain          //            SID=DQAAAGgA...7Zg8CTN         //            LSID=DQAAAGsA...lk8BBbG         //            Auth=DQAAAGgA...dk3fA5N         // so all we need to do is look for "Auth" and get the token that comes after it              StringTokenizer tokenizer = new StringTokenizer(postOutput, "=\n ");         String token = null;                  while (tokenizer.hasMoreElements()) {             if (tokenizer.nextToken().equals("Auth")) {                 if (tokenizer.hasMoreElements()) {                     token = tokenizer.nextToken();                  }                 break;             }         }         if (token == null) {             System.out.println("Authentication error. Response from server:\n" + postOutput);             System.exit(1);         }         return token;     }     /**      * Displays the "items" feed, that is the feed that contains the items that      * belong to the currently authenticated user.      *       * @param token the authorization token, as returned by      *                &lt;code&gt;authenticate&lt;code&gt;      * @throws IOException if an IOException occurs while creating/reading the       *                 request      */     public void displayMyItems(String token) throws MalformedURLException, IOException {         HttpURLConnection connection = (HttpURLConnection)(new URL(ITEMS_FEED)).openConnection() ;         // Set properties of the connection         connection.setRequestMethod("GET");         connection.setRequestProperty("Authorization", "GoogleLogin auth=" + token);         int responseCode = connection.getResponseCode();         InputStream inputStream;         if (responseCode == HttpURLConnection.HTTP_OK) {             inputStream = connection.getInputStream();         } else {             inputStream = connection.getErrorStream();         }                  System.out.println(toString(inputStream));      }          /**      * Makes a HTTP POST request to the provided {@code url} given the provided      * {@code parameters}. It returns the output from the POST handler as a      * String object.      *       * @param url the URL to post the request      * @return the output from the Google Accounts server, as string      * @throws IOException if an I/O exception occurs while      *                     creating/writing/reading the request      */     private String makeLoginRequest(URL url)             throws IOException {         // Create a login request. A login request is a POST request that looks like         // POST /accounts/ClientLogin HTTP/1.0         // Content-type: application/x-www-form-urlencoded         // [email protected]&amp;Passwd=north23AZ&amp;service=gbase&amp;source=Insert Example         // Open connection         HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();                       // Set properties of the connection         urlConnection.setRequestMethod("POST");         urlConnection.setDoInput(true);         urlConnection.setDoOutput(true);         urlConnection.setUseCaches(false);         urlConnection.setRequestProperty("Content-Type",                                                                          "application/x-www-form-urlencoded");              // Form the POST parameters         StringBuilder content = new StringBuilder();         content.append("Email=").append(URLEncoder.encode(EMAIL, "UTF-8"));         content.append("&amp;Passwd=").append(URLEncoder.encode(PASSWORD, "UTF-8"));         content.append("&amp;service=").append(URLEncoder.encode("gbase", "UTF-8"));         content.append("&amp;source=").append(URLEncoder.encode("Repace service example", "UTF-8"));         OutputStream outputStream = urlConnection.getOutputStream();         outputStream.write(content.toString().getBytes("UTF-8"));         outputStream.close();              // Retrieve the output         int responseCode = urlConnection.getResponseCode();         InputStream inputStream;         if (responseCode == HttpURLConnection.HTTP_OK) {             inputStream = urlConnection.getInputStream();         } else {             inputStream = urlConnection.getErrorStream();         }              return toString(inputStream);     }     /**      * Writes the content of the input stream to a &lt;code&gt;String&lt;code&gt;.      */     private String toString(InputStream inputStream) throws IOException {         String string;         StringBuilder outputBuilder = new StringBuilder();         if (inputStream != null) {             BufferedReader reader =                     new BufferedReader(new InputStreamReader(inputStream));             while (null != (string = reader.readLine())) {                 outputBuilder.append(string).append('\n');             }         }         return outputBuilder.toString();     } }</code>

<code>         改代碼的執行結果如下:</code>

<code></code><code>&lt;?xml version='1.0' encoding='UTF-8'?&gt;&lt;entry xmlns='http://www.w3.org/2005/Atom' xmlns:gm='http://base.google.com/ns-metadata/1.0' xmlns:g='http://base.google.com/ns/1.0' xmlns:batch='http://schemas.google.com/gdata/batch'&gt;&lt;id&gt;http://www.google.com/base/feeds/items/2139682888944988653&lt;/id&gt;&lt;published&gt;2009-08-01T12:55:09.000Z&lt;/published&gt;&lt;updated&gt;2009-08-01T12:55:09.000Z&lt;/updated&gt;&lt;category scheme='http://base.google.com/categories/itemtypes' term='repaceService'/&gt;&lt;title type='text'&gt;EchoService_ID&lt;/title&gt;&lt;content type='html'&gt;08d8440b82554bad9a7a5ad9a1487&lt;/content&gt;&lt;link rel='alternate' type='text/html' href='http://base.google.com/base/a/6380400/D2139682888944988653'/&gt;&lt;link rel='self' type='application/atom+xml' href='http://www.google.com/base/feeds/items/2139682888944988653'/&gt;&lt;link rel='edit' type='application/atom+xml' href='http://www.google.com/base/feeds/items/2139682888944988653'/&gt;&lt;author&gt;&lt;name&gt;Panpan Zhan&lt;/name&gt;&lt;email&gt;[email protected]&lt;/email&gt;&lt;/author&gt;&lt;g:target_country type='text'&gt;US&lt;/g:target_country&gt;&lt;g:expiration_date type='dateTime'&gt;2038-01-19T03:14:07Z&lt;/g:expiration_date&gt;&lt;g:customer_id type='int'&gt;6380400&lt;/g:customer_id&gt;&lt;g:item_language type='text'&gt;en&lt;/g:item_language&gt;&lt;g:item_type type='text'&gt;repaceService&lt;/g:item_type&gt;&lt;gd:feedLink xmlns:gd='http://schemas.google.com/g/2005' rel='media' href='http://www.google.com/base/feeds/items/2139682888944988653/media'countHint='0'/&gt;&lt;/entry&gt;</code>

<code>    這樣就完成了一些簡單的Gbase操作的例子。</code>  

   本文轉自panpan3210 51CTO部落格,原文連結:http://blog.51cto.com/panpan/187258,如需轉載請自行聯系原作者