grailsを用いてウェブサイトのAPIを実現する一つの考え方
周知のように、現在多くのサイトがAPIのサービスを提供しており、JavaEyeも含まれています.Webサイトを呼び出すAPIは、他のシステムにインタフェースを提供し、開発者がmashupを実現するのに便利です.
一般的なAPIは、ウェブサービスであってもよいし、xml、jsonを返すことであってもよいが、実際にはウェブサービスもxmlを返す.grailsを使用すると、プラグインを使用することなくxmlを返すことができます.もちろんgrailsでwebサービスを使うのもかなり簡単です.
次はAPIのcontrollerです.
こうやってアクセスhttp://localhost:8080/プロジェクト名/api/login?userName=test&password=test
ユーザー名がtestパスワードがtestのユーザーがいる場合は、次のようなxmlを返します.
ユーザーが存在しない場合もxmlが返されます.
外部呼び出しのために他のメソッドを追加する必要がある場合は、actionを追加してrender as xmlを追加します.
注意すべき点は、grailsのfilterを使用している場合は、私のコードのような適切なfilterを変更する必要があります.
このようにapicontrollerにアクセスすればxmlを返すことができ,そうでなければログインページに戻るしかない.
他のクライアント側や他はxmlを解析するだけで対応するデータが得られる.
例えばandoridを使用してシステムのクライアントを作り、grailsを採用して実現し、まず最初のステップはシステムにログインする必要があります.ログインすると、ユーザー名とパスワードを検証します.
ログインのコードは次のとおりです.
LoginActivityは主にHttpClientシミュレーションリクエストシステムを通じて、ウェブサイトのapiを呼び出し、xmlを返す.xml検証にユーザーが存在するかどうかを解析します.
MainActivityのコードは簡単で、主にmain.xmlを使用しています.以下のようにします.
このように私達はシステムに上陸することができて、インタフェースはとても簡単で、ただこの構想を通じてウェブサイトのAPIを実現します
[img]http://dl.iteye.com/upload/attachment/206548/84cb8a2d-11e1-3bce-84e8-376ce4b2c536.jpg[/img]
一般的なAPIは、ウェブサービスであってもよいし、xml、jsonを返すことであってもよいが、実際にはウェブサービスもxmlを返す.grailsを使用すると、プラグインを使用することなくxmlを返すことができます.もちろんgrailsでwebサービスを使うのもかなり簡単です.
次はAPIのcontrollerです.
import grails.converters.*
class ApiController {
def login = {
def userName = params.userName
def password = params.password
def user = User.findWhere(userName:userName,password:password)
if (user)
render user as XML
else
render(text:"not found user ",contentType:"text/xml",encoding:"UTF-8")
}
}
こうやってアクセスhttp://localhost:8080/プロジェクト名/api/login?userName=test&password=test
ユーザー名がtestパスワードがtestのユーザーがいる場合は、次のようなxmlを返します.
test
test
ユーザーが存在しない場合もxmlが返されます.
外部呼び出しのために他のメソッドを追加する必要がある場合は、actionを追加してrender as xmlを追加します.
注意すべき点は、grailsのfilterを使用している場合は、私のコードのような適切なfilterを変更する必要があります.
class LoginFilters {
def filters = {
loginCheck(controller:'*', action:'*'){
before = {
if (params.controller == "api") {
return true
}
if(!session.user) {
if( !actionName.equals('login') && !actionName.equals('doLogin') ) {
redirect(controller:'user',action:'login')
return false
}
}
}
}
}
}
このようにapicontrollerにアクセスすればxmlを返すことができ,そうでなければログインページに戻るしかない.
他のクライアント側や他はxmlを解析するだけで対応するデータが得られる.
例えばandoridを使用してシステムのクライアントを作り、grailsを採用して実現し、まず最初のステップはシステムにログインする必要があります.ログインすると、ユーザー名とパスワードを検証します.
ログインのコードは次のとおりです.
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpProtocolParams;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
/**
* @author Tony Shen
*
*/
public class LoginActivity extends Activity {
Button cancleButton; //
Button loginButton; //
String responseBody = null;
String result = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
validate();
}
private void validate() {
cancleButton = (Button) findViewById(R.id.cancel);
cancleButton.setOnClickListener(cancleListener);
loginButton = (Button) findViewById(R.id.login);
loginButton.setOnClickListener(loginListener);
}
// cancle
OnClickListener cancleListener = new OnClickListener() {
public void onClick(View v) {
Intent intent0 = new Intent(LoginActivity.this, LoginActivity.class);
startActivity(intent0);
}
};
// login
OnClickListener loginListener = new OnClickListener() {
public void onClick(View v) {
CharSequence userNameValue = ((EditText) findViewById(R.id.username)).getText();
CharSequence passwordValue = ((EditText) findViewById(R.id.password)).getText();
String url = "/TheSales/api/login";
String host = "192.168.1.2:8080";
String params = "userName="+userNameValue.toString()+"&password="+passwordValue.toString();
HttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(HttpProtocolParams.HTTP_CONTENT_CHARSET,"UTF-8");
HttpGet httpget = new HttpGet("http://"+host+url+"?"+params);
ResponseHandler responseHandler = new BasicResponseHandler();
try {
responseBody = httpclient.execute(httpget, responseHandler);
Document document = DocumentHelper.parseText(responseBody);
Element root = document.getRootElement();
if("not found user".equals(root.elementText("user")))
{
showDialog(1);
} else {
Intent intent1 = new Intent(LoginActivity.this,c.class);
startActivity(intent1);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
protected Dialog onCreateDialog(int id) {
return buildDialog(LoginActivity.this);
}
private Dialog buildDialog(Context context) {
Dialog dialog = new Dialog(context);
dialog.setTitle(" , !");
return dialog;
}
}
LoginActivityは主にHttpClientシミュレーションリクエストシステムを通じて、ウェブサイトのapiを呼び出し、xmlを返す.xml検証にユーザーが存在するかどうかを解析します.
MainActivityのコードは簡単で、主にmain.xmlを使用しています.以下のようにします.
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text=" !" />
このように私達はシステムに上陸することができて、インタフェースはとても簡単で、ただこの構想を通じてウェブサイトのAPIを実現します
[img]http://dl.iteye.com/upload/attachment/206548/84cb8a2d-11e1-3bce-84e8-376ce4b2c536.jpg[/img]