基於易班API的Java開發入門教程
阿新 • • 發佈:2019-02-05
老師讓我做一個基於易班的小系統,裡面要用到易班的相關資訊,先寫一個小的Demo試一下,可以實現的功能是:使用易班賬號登入,並獲取當前登入易班賬號的基本資訊和當前登入賬號所加入的公共群資訊
開發環境:JDK1.7+tomcat8.0+eclipse
易班的SDK:最新版本
接下來一路【OK】下去就好,如果執行的時候提示沒有相關的類,那還是老老實實的把jar複製到lib資料夾下吧(或者可以試試System Library,在給User Library命名的時候)
訪問易班開放平臺點選開啟連結,建立一個【網站接入】應用,選擇【網站接入】是因為它可以100%的都是自己的內容,如果用站內應用,那麼在介面上會有易班的元素。記錄下該應用的AppID、AppSecret、網站地址和oauth2.0回撥地址,這四個是待會要用到的引數。
我這裡是在本機上開發,所以就設定網站地址為localhost
之後再建立一個util工具類用來儲存易班API的地址,我把這個類叫做APIUtil.java,我在這裡只用到了一個API介面,你們做應用應該會用到很多的吧
匯入SDK
(寫在前邊的話,你直接把壓縮包中的所有jar檔案複製到專案的lib資料夾下感覺簡單) 新建一個【Dynamic Web Project】專案,選擇【Java Resources】 ->【Libraries】 ->隨便找一個選項右鍵->選擇【Bulid Path】->【Configure Build Path】,如圖(在Properties中搜索【Java Build Path】亦可)接下來一路【OK】下去就好,如果執行的時候提示沒有相關的類,那還是老老實實的把jar複製到lib資料夾下吧(或者可以試試System Library,在給User Library命名的時候)
建立易班APP
使用SDK開發
首先建立一個util類,名叫APPUtil.java,改APP相關的資料放在此處,也可用列舉package com.demo.util; public class AppUtil { /** * App的id或者叫做appkey */ public static final String APPID = "f548995debd82f12"; /** * App的AppSecret */ public static final String APPSECRET = "8fa24c631c18b9e47a471e6bee83c9ac"; /** * App的回撥地址 */ public static final String BACKURL = "http://127.0.0.1:8080/YiBanDemo/content"; /** * App的訪問地址 */ public static final String WEBSITEURL = "http://127.0.0.1:8080/YiBanDemo/"; }
之後再建立一個util工具類用來儲存易班API的地址,我把這個類叫做APIUtil.java,我在這裡只用到了一個API介面,你們做應用應該會用到很多的吧
package com.demo.util;
public class APIUtil {
/**
* 獲取當前使用者已加入的公共群,access_token,page(選填),count(選填)
*/
public static final String PUBLIC_GROUP = "https://openapi.yiban.cn/group/public_group";
}
好了,現在我們~嗯,先從view層做吧,反正也不打這個專案
易班公共平臺使用的是oauth2.0介面,嗯,不太理解,感覺就是先訪問一次獲取token,在那這個token在訪問一次獲取到授權。
嗯,先做吧。
建立一個index.jsp,當前應用預設的訪問地址就會訪問到這個頁面,它的內容如下:
這樣當訪問這個應用的預設頁面的時候就可以跳轉到AppUtil.BACKURL的位置了,也就是真正的應用主頁,在跳轉過程中,我們給他加一個過濾器,以防止未經許可的請求通過url來訪問到真實的主頁,這個過濾器的內容如下<%@page import="com.demo.util.AppUtil"%> <%@page import="cn.yiban.open.Authorize"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>易班授權</title> </head> <body> <% //調取AppUtil中的資料來跳轉到指定的獲取授權地址 Authorize authorize = new Authorize(AppUtil.APPID, AppUtil.APPSECRET); String url = authorize.forwardurl(AppUtil.BACKURL, null, Authorize.DISPLAY_TAG_T.WEB); response.sendRedirect(url); %> </body> </html>
package com.demo.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.demo.util.AppUtil;
import cn.yiban.open.Authorize;
import cn.yiban.open.common.User;
import net.sf.json.JSONObject;
/**
* 過濾指向content資料夾中的訪問,防止直接通過url來進行訪問
*/
@WebFilter("/content/*")
public class LoginFilter implements Filter {
/**
* Default constructor.
*/
public LoginFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest args1, ServletResponse args2, FilterChain chain) throws IOException, ServletException {
//判斷當前是否有登入,如果沒有就跳轉到登入頁面
HttpServletRequest request = (HttpServletRequest)args1;
HttpServletResponse response = (HttpServletResponse) args2;
if(request.getSession().getAttribute("user") == null) {
//當前沒有登入,判斷是否有code
if(request.getParameter("code") != null) {
//是登入請求,直接在filter中給他登入好了
String code = request.getParameter("code");
Authorize authorize = new Authorize(AppUtil.APPID, AppUtil.APPSECRET);
JSONObject json = JSONObject.fromObject(authorize.querytoken(code, AppUtil.BACKURL));
String accessToken = json.getString("access_token");
request.getSession().setAttribute("access_token", accessToken);
User user = new User(accessToken);
request.getSession().setAttribute("user", user);
response.sendRedirect("../content/");
} else {
//非法請求,跳轉回登入頁面
response.sendRedirect("../index.jsp");
}
} else {
//正常請求,放行
chain.doFilter(request, response);
}
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
在這個過濾器中,能夠過濾所有訪問content資料夾目錄下的請求,如果判斷到當前的session沒有user這個屬性的話,就會判斷認為是登入請求或者是非法的登入請求(當然登入之後記得把user加入到session中哦),通過判斷當前request中是否有code這個屬性可以知道它是登入請求還是非法請求(但是如果在非法的url請求中加上code引數就會出現JSONObject["access_token"] not found.)
正確訪問到content中的主頁之後,這個主頁的內容如下
<%@page import="net.sf.json.JSONObject"%>
<%@page import="cn.yiban.open.common.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>主頁</title>
</head>
<body>
<%
User user = (User)session.getAttribute("user");//user.me()返回一個JSON,獲取該JSON種的info資訊
JSONObject userInfo = JSONObject.fromObject(user.me()).getJSONObject("info");
%>
<h2>這裡是主頁</h2>
<h4>登入使用者資訊</h4>
<table>
<tr>
<td>使用者ID</td>
<td><%=userInfo.getString("yb_userid") %></td>
<td>使用者名稱</td>
<td><%=userInfo.getString("yb_username") %></td>
<td>使用者暱稱</td>
<td><%=userInfo.getString("yb_usernick") %></td>
</tr>
<tr>
<td>性別</td>
<td><%=userInfo.getString("yb_sex") %></td>
<td>網薪數</td>
<td><%=userInfo.getString("yb_money") %></td>
<td>經驗值</td>
<td><%=userInfo.getString("yb_exp") %></td>
</tr>
<tr>
<td>使用者頭像</td>
<td><img src="<%=userInfo.getString("yb_userhead")%>"></td>
<td>註冊時間</td>
<td><%=userInfo.getString("yb_regtime") %></td>
<td>學校名字和ID</td>
<td><%=userInfo.getString("yb_schoolid") %>:<%=userInfo.getString("yb_schoolname") %></td>
</tr>
</table>
<h4>當前使用者所加入公共群列表</h4>
<form action="../GroupServlet">
<input type="hidden" name="method" value="group_public_group">
<input type="submit">
</form>
</body>
</html>
它的功能是顯示當前授權用的基本資訊和獲取該使用者所加入的公共群的資料,顯示使用者的相關資訊的功能邏輯是這樣的,從session取出當前登入的user,呼叫該user的me()方法並解析JSON,在web頁面中顯示出來。
獲取加入的公共群資訊的功能實現如下
package com.demo.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.NameValuePair;
import com.demo.util.APIUtil;
import cn.yiban.open.common.User;
import cn.yiban.util.HTTPSimple;
import net.sf.json.JSONObject;
/**
* Servlet implementation class GroupServlet
*/
@WebServlet("/GroupServlet")
public class GroupServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public GroupServlet() {
super();
// TODO Auto-generated constructor stub
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String method = request.getParameter("method");
if(method.equals("group_public_group")) {
//獲取當前使用者所加入的群
//要傳入的引數
String query = APIUtil.PUBLIC_GROUP+
"?access_token="+request.getSession().getAttribute("access_token");
JSONObject backJson = JSONObject.fromObject(HTTPSimple.GET(query));
System.out.println(backJson);
if(backJson.getString("status").equals("success")) {
//獲取成功的情況
} else {
//獲取失敗的情況
}
}
}
}
我這裡就沒有再往下做了,將會在控制檯輸出獲得到的群資訊,其他的介面、邏輯與之類似。