少し前に、新しいSpringSourceプロジェクトについて
書いた :
spring-social 。 今日は、このライブラリをどのように使用できるかを伝えたい(または例を示したい)。 例として、最も単純なアプリケーションを使用します。これにより、3つすべてのサービスにログインし、3つすべてで同時にステータスを更新できます(注意-カットの下に多くの文字とコードがあり、画像がまったくありません)。
ステータスの更新は、次の理由で例として取り上げられました。
*シンプルで明確です。
*この機能はLinkedInのspring-socialではサポートされていません。つまり、デフォルトでspring-socialに実装されていないサービスのAPIメソッドの実装を追加する方法を確認できます。
原則として、ステータス更新のサイトには他の機能があります。
開発者自身は、ライブラリを使用する例としてアプリケーションGreenHouseを参照することをお勧めします-しかし、アプリケーションは非常に大きく、「ソーシャル」部分の分離はそれほど簡単ではありません。 いくつかの例も公開されましたが、「完全な画像」を提供することなく、かなり原始的なものです。 そのため、一方ではサービスへのログインからステータスの送信までの完全な例を表し、一方ではできる限り簡単な小さな例を作成することにしました(自分で理解し、他の人に見せるため)。 したがって-スタイルなしでhtmlが裸であることに失礼します-さらに、Javaコードは常に「美しい」とは限りません-一部の場所では、たとえば継承によってコードを「より正確に」することができますが、例を洗い流してしまうでしょう追加のクラス階層。
この投稿は私の
英語投稿の無料翻訳です。
すべてのソースはsvnで入手できます:
http :
//svn.emforge.net/svnroot/akakunin-experiments/update-status
ソースは
、EmForge Webサイトでも表示でき
ます。
基本アプリケーション
「ベース」として、spring frameworkおよびspring-mvcで最も単純なアプリケーションを使用します。 このアプリケーションは、標準の紳士のセットを使用します。
*アセンブリ用のMaven。
* Spring Framework 3.0.5;
* Spring-Security 3.0.5;
* JPA(Hibernate経由);
*ベースとしてのHSQL。
原則として、すべてが可能な限り標準的でシンプルです。 ユーザー(userName、password)を格納するエンティティは、
net.emforge.updatestatus.entity.Userのみです。 ユーザーごとにトークンも保存され、各サービスでの作業に使用されます。
DAOクラス
UserDaoと
UserServiceImplサービスがあります。
アプリケーションには2つのページがあります-メインページ(ログイン)と登録(
UserControllerによって処理される)のフォームを持つインデックス(ステータスページはログインユーザーのみ利用可能です-後で説明します)。
一緒に、これはユーザーが登録またはログインでき、ステータスページでサービスの1つに接続してステータスを更新できる最も単純なアプリケーションです。
アプリケーション登録
この例を機能させるには、まず、使用するサービスにアプリケーションを登録する必要があります。
* Facebookへの登録はページ
http://developers.facebook.com/setup/で実行されます-SiteURLとして
localhostのみを使用してください:8080 / update-status /-そうでない場合、コールバックは機能しません。
* Twitterで登録:
http :
//dev.twitter.com/apps/new ;
* LinkedInに参加:
https :
//www.linkedin.com/secure/developer
いずれの場合も、アプリケーションキー(またはアプリケーションID)とセキュリティトークンの2つのキーを受け取ります。これらは
src / main / resources / config.propertiesに保存する必要があります
速く走る
すぐにそれがどのように機能し、javaとmavenを持っているかを確認したい場合(これがそうであることを願っています:))-svnからソースを取得して実行します(config.propertiesにキーを書き込んだ後)
mvn tomcat:run
その後、アプリケーションは
http:// localhost:8080 / update-statusで利用可能になり
ます。
新しいユーザーを作成します-そして、行くと、それがどのように実装されているかがわかります
LinkedInおよびTwitter Connect
OAuthは両方のサービスを操作するために使用され、接続手順も同様です。したがって、Twitterの例を紹介します。
サービスを操作するために、getOAuthServiceのメインメソッドである最も単純なクラス
TwitterProviderを作成します。
public OAuthService getOAuthService() {
OAuthConfig config = new OAuthConfig();
config.setRequestTokenEndpoint( "https://api.twitter.com/oauth/request_token" );
config.setAccessTokenEndpoint( "https://api.twitter.com/oauth/access_token" );
config.setAccessTokenVerb(Verb.POST);
config.setRequestTokenVerb(Verb.POST);
config.setApiKey(apiKey);
config.setApiSecret(apiSecret);
config.setCallback(callbackUrl);
return new OAuth10aServiceImpl(
new HMACSha1SignatureService(),
new TimestampServiceImpl(),
new BaseStringExtractorImpl(),
new HeaderExtractorImpl(),
new TokenExtractorImpl(),
new TokenExtractorImpl(),
config);
}
apiKey、apiSecret、 callbackUrlは config.propertiesから注入され
ます (最初から記述しています)。
接続のために、リンク
/ connet / twitterを追加し、ハンドラーを
切断します(
SocialController内 ):
@RequestMapping(value = "/connect/twitter" , method = RequestMethod.GET)
public String requestConnectionToTwitter(WebRequest request) {
// get request token
Token requestToken = twitterProvider.getOAuthService().getRequestToken();
// store request token in session
request.setAttribute( "twitter_request_token" , requestToken, WebRequest.SCOPE_SESSION);
return "redirect:" + twitterProvider.getAuthorizeUrl() + "?oauth_token=" + requestToken.getToken();
}
実際、このハンドラーはTwitterにリダイレクトしてログインを行います。 ログインに成功した場合、TwitterはcallbackUrlにリダイレクトし、そこにユーザーのキーを渡します。 SocialControllerにコールバックハンドラーを追加します。
/** Callback from twitter on success login
*
* @param verifier
* @param request
* @return
*/
@RequestMapping(value = "/callback/twitter" , method = RequestMethod.GET, params = "oauth_token" )
public String authorizeTwitterCallback(@RequestParam(value = "oauth_verifier" , defaultValue = "verifier" ) String verifier,
WebRequest request) {
// get request token from session
Token requestToken = (Token)request.getAttribute( "twitter_request_token" , WebRequest.SCOPE_SESSION);
// get access token
Token accessToken = twitterProvider.getOAuthService().getAccessToken(requestToken, new Verifier(verifier));
String userName = getCurrentUser().getName();
userService.updateTwitterAuthentication(userName, accessToken.getToken(), accessToken.getSecret());
return "redirect:/status" ;
}
このハンドラでは、トークンを受け取り、将来使用するためにユーザー用にトークンを保存します。
Facebook Connect
Facebookではすべてが少し複雑です。 Facebookに接続するには、次のコードを使用して
status.jspページに「Facebookに接続」ボタンを
配置します。
< form id ="fb_signin" action ="<c:url value=" / connect / facebook " /> " method="post" >
< div class ="formInfo" >
</ div >
< div id ="fb-root" ></ div >
< p >< fb:login-button perms ="email,publish_stream,offline_access" onlogin ="$('#fb_signin').submit();" v ="2" length ="long" > Connect to Facebook </ fb:login-button ></ p >
</ form >
< facebook:init />
次の点に注意することが重要です。
*
facebook:initタグはspring-socialライブラリーに実装され、
$ {facebookProvider}ビンがspringコンテキストにある必要があります
-FacebookProviderクラスに実装されて
います。 実際、タグはこのBeanからキーのみを取得します。
*
fb:login-buttonはConnect to Facebookボタンを生成します;
* form-action
/ connect / facebookは、ログインに成功した場合のコールバックとして使用されます。
また、このコードが機能するためには、tagLibを接続する必要があります
<%@ taglib uri="http://www.springframework.org/spring-social/facebook/tags" prefix="facebook" %>
jQueryを接続します-私の場合は、
さて、あなたは/ connect / facebookに来るコールバックハンドラを書く必要があります:
@RequestMapping(value= "/connect/facebook" , method=RequestMethod.POST)
public String connectAccountToFacebook(@FacebookAccessToken String accessToken,
@FacebookUserId String facebookUserId) {
if (facebookUserId != null && accessToken != null ) {
// store facebook information
String userName = getCurrentUser().getName();
userService.updateFacebookAuthentication(userName, accessToken, facebookUserId);
}
return "redirect:/status" ;
}
* This source code was highlighted with Source Code Highlighter .
この例では、2つの興味深いアノテーションが表示されます。@ FacebookAccessTokenと@FacebookUserIdは春のソーシャル機能の1つですが、機能させるには、特別なWebArgResolverをプロジェクトに追加する必要があります。 これを行うには、
applicationContext.xmlに追加し
ます 。
< bean id ="facebookWebArgResolver" class ="org.springframework.social.facebook.FacebookWebArgumentResolver" >
< constructor-arg name ="apiKey" value ="${facebook.appId}" />
</ bean >
* This source code was highlighted with Source Code Highlighter .
コールバック処理はTiwtterとLinkedinに似ています-キーを保存し(この場合facebookUserIdとfacebookToken)、さらに使用します。
TwitterとFacebookでステータスを共有する
接続済み、接続済み、ステータスを更新できるようになりました。 ステータスページには、ユーザーがテキストを入力してメッセージを送信するtextAreaがあります。 フォームハンドラは次のようになります。
@RequestMapping(value = "/status" , method = RequestMethod.POST)
public String sendStatus(@Valid StatusForm statusForm, BindingResult result, ModelMap modelMap) {
User user = getCurrentUser();
LinkedInTemplateExt linkedInTemplate = linkedInProvider.createTemplate(user);
FacebookTemplate facebookTemplate = facebookProvider.createTemplate(user);
TwitterTemplate twitterTemplate = twitterProvider.createTemplate(user);
// send message to LinkedIn
if (linkedInTemplate != null ) {
linkedInTemplate.updateStatus(statusForm.getStatus());
}
// send message to Facebook
if (facebookTemplate != null ) {
facebookTemplate.updateStatus(statusForm.getStatus());
}
// send message to Twitter
if (twitterTemplate != null ) {
twitterTemplate.updateStatus(statusForm.getStatus());
}
return "redirect:/status" ;
}
* This source code was highlighted with Source Code Highlighter .
このハンドラーでは、現在のユーザーのキーを使用して
FacebookTemplateと
TwitterTemplate (spring-socialの両方のクラス)を取得し、
updateStatusメソッドを呼び出し
ます
LinkedInステータスの送信
LinkedInはもう少し複雑であることが判明しました
-spring -socialに実装されているLinkedInTemplateにはステータスを更新するメソッドが含まれていないため、自分で作成する必要があります(REST-APIコール
api.linkedin.com/v1/people/~/personを使用します
) -アクティビティ )。 これを行うには、
LinkedInTemplateExtクラスを作成します。これは、「元の」LinkedInTemplateの後継クラスです。
*
RestOperationsクラスの独自のオブジェクトを初期化します-これは、「正しい」コールエンコーディング(別のスプリングソーシャル機能)に特別なOAuth1RequestSignerFactory.getRequestSignerを使用します。
* updateStatusメソッド自体を実装します。
public void updateStatus(String message) {
LinkedInPersonActivity personActivity = new LinkedInPersonActivity(message);
restOperationsExt.postForLocation( "http://api.linkedin.com/v1/people/~/person-activities" , personActivity);
}
* This source code was highlighted with Source Code Highlighter .
また、
LinkedInPersonActivityクラスを記述する必要があります-ステータスを渡すには:
@XmlRootElement(name = "activity" )
public class LinkedInPersonActivity {
public LinkedInPersonActivity() {
}
public LinkedInPersonActivity(String body) {
this .body = body;
}
@XmlElement(name = "content-type" )
String contentType = "linkedin-html" ;
@XmlElement(name = "body" )
String body;
}
* This source code was highlighted with Source Code Highlighter .
それだけです-メソッドは準備ができています-ご覧のとおり-LinkedInTemplateは最初はAPIからの関数をほとんどサポートしていませんが、新しい関数の追加はそれほど難しいタスクではありません。
以上で、この例が役立つことを願っています。