这几天使用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对,如
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对,如
kung pao chicken
一个entry的信息如下所示:
xml
version
='1.0'
?>
<
entry
xmlns
='http://www.w3.org/2005/Atom'
xmlns:g
='http://base.google.com/ns/1.0'
>
<
author
>
<
name
>Jane Doe
name
>
<
email
>[email protected]
email
>
author
>
<
category
scheme
='http://www.google.com/type'
term
='googlebase.item'
/>
<
title
type
='text'
>He Jingxian's chicken
title
>
<
content
type
='xhtml'
>
<
div
xmlns
='http://www.w3.org/1999/xhtml'
>Delectable Sichuan specialty
div
>
content
>
<
link
rel
='alternate'
type
='text/html'
href
='http://www.host.com/123456jsh9'
/>
<
g:item_type
>Recipes
g:item_type
>
<
g:cooking_time
>30
g:cooking_time
>
<
g:main_ingredient
>chicken
g:main_ingredient
>
<
g:main_ingredient
>chili peppers
g:main_ingredient
>
<
g:main_ingredient
>peanuts
g:main_ingredient
>
<
g:spices_used
>Szechuan peppercorn
g:spices_used
>
<
g:cook_technique
>blackened
g:cook_technique
>
entry
>
每一个item都有一个URL,或者说一个唯一的ID,用于标识这个item或者说entry,比我添加的一条记录的URL如下所示:
http://base.google.com/base/feeds/items/2139682888944988653
item ID是
2139682888944988653。
这个URL一般是程序代码中使用的,item自己生成的URL是http://base.google.com/base/a/6380400/D2139682888944988653,他们的实质都是一样的。
每一个Googel base API操作跟HTTP方法相同,你可以使用HTTP GET、POST、PUT和DELETE方法来操作。
一个查询的例子如下所示:
发送的HTTP请求是:
GET /base/feeds/snippets?bq=digital+camera
Content-Type: application/atom+xml
Authorization: AuthSub token=""
X-Google-Key: key=ABQIAAAA7VerLsOcLuBYXR7vZI2NjhTRERdeAiwZ9EeJWta3L_JZVS0bOBRIFbhTrQjhHE52fqjZvfabYYyn6A
由于响应信息比较多,这里就不显示了。
使用API添加item的代码如下所示。
InsertExample.java代码:
/* 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 =
"\n" +
"
" xmlns:g='http://base.google.com/ns/1.0'>\n" +
" repaceService \n" +
" EchoService_ID \n" +
" 08d8440b82554bad9a7a5ad9a1487 \n" +
" ";
/**
* URL used for authenticating and obtaining an authentication token.
* More details about how it works:
* http://code.google.com/apis/accounts/AuthForInstalledApps.html
*/
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 InsertExample
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 DATA_ITEM
by making a POST request to
* ITEMS_URL.
* @param token authentication token obtained using authenticate
* @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]&Passwd=north23AZ&service=gbase&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("&Passwd=").append(URLEncoder.encode(PASSWORD, "UTF-8"));
content.append("&source=").append(URLEncoder.encode("Repace service example", "UTF-8"));
content.append("&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 String.
*/
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();
}
}
如果email和密码正确,验证通过,则在你的email帐号下的Gbase下添加了一条item,这个item需要大概1天的时间能够通过google搜索。
QueryExample3.java代码:
/* 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:
* http://code.google.com/apis/accounts/AuthForInstalledApps.html
*/
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 QueryExample3
instance and call
* displayMyItems
, 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
* authenticate
* @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]&Passwd=north23AZ&service=gbase&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("&Passwd=").append(URLEncoder.encode(PASSWORD, "UTF-8"));
content.append("&service=").append(URLEncoder.encode("gbase", "UTF-8"));
content.append("&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 String.
*/
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();
}
}
改代码的执行结果如下:
xml
version
='1.0'
encoding
='UTF-8'
?>
<
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'
>
<
id
>http://www.google.com/base/feeds/items/2139682888944988653
id
>
<
published
>2009-08-01T12:55:09.000Z
published
>
<
updated
>2009-08-01T12:55:09.000Z
updated
>
<
category
scheme
='http://base.google.com/categories/itemtypes'
term
='repaceService'
/>
<
title
type
='text'
>EchoService_ID
title
>
<
content
type
='html'
>08d8440b82554bad9a7a5ad9a1487
content
>
<
link
rel
='alternate'
type
='text/html'
href
='http://base.google.com/base/a/6380400/D2139682888944988653'
/>
<
link
rel
='self'
type
='application/atom+xml'
href
='http://www.google.com/base/feeds/items/2139682888944988653'
/>
<
link
rel
='edit'
type
='application/atom+xml'
href
='http://www.google.com/base/feeds/items/2139682888944988653'
/>
<
author
>
<
name
>Panpan Zhan
name
>
<
email
>[email protected]
email
>
author
>
<
g:target_country
type
='text'
>US
g:target_country
>
<
g:expiration_date
type
='dateTime'
>2038-01-19T03:14:07Z
g:expiration_date
>
<
g:customer_id
type
='int'
>6380400
g:customer_id
>
<
g:item_language
type
='text'
>en
g:item_language
>
<
g:item_type
type
='text'
>repaceService
g:item_type
>
<
gd:feedLink
xmlns:gd
='http://schemas.google.com/g/2005'
rel
='media'
href
='http://www.google.com/base/feeds/items/2139682888944988653/media'
countHint
='0'
/>
entry
>
这样就完成了一些简单的Gbase操作的例子。