使用XPages从托管bean获取数据

时间:2013-12-11 20:58:03

标签: json xpages lotus-domino

我正在尝试创建一个Twitter用户列表,用用户的关注者数量和他们的个人资料图片填充它。由于Twitter的API,您需要在使用REST API之前获取应用程序的访问令牌。我认为最好的方法是通过Java和托管bean。我发布了下面的代码,目前有效。我从Twitter获取访问令牌,然后进行API调用以获取用户信息,该信息是JSON。

我的问题是,解析JSON并迭代用户名列表以在XPage上创建表/网格的最佳方法是什么?

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;

import javax.net.ssl.HttpsURLConnection;

import org.apache.commons.codec.binary.Base64;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;


public class TwitterUser implements Serializable {

    private static final String consumerKey = "xxxx";
    private static final String consumerSecret = "xxxx";
    private static final String twitterApiUrl = "https://api.twitter.com";
    private static final long serialVersionUID = -2084825539627902622L;

    private static String accessToken; 
    private String twitUser;

    public TwitterUser() {
        this.twitUser = null;
    }

    public String getTwitterUser(String screenName) {
        try {
            this.requestTwitterUserInfo(screenName);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return twitUser;
    }

    public void setTwitterUser() {
        twitUser = twitUser;
    }

//Encodes the consumer key and secret to create the basic authorization key
private static String encodeKeys(String consumerKey, String consumerSecret) {
    try {
        String encodedConsumerKey = URLEncoder.encode(consumerKey, "UTF-8");
        String encodedConsumerSecret = URLEncoder.encode(consumerSecret, "UTF-8");
        String fullKey = encodedConsumerKey + ":" + encodedConsumerSecret;
        byte[] encodedBytes = Base64.encodeBase64(fullKey.getBytes());
        return new String(encodedBytes);  
    }
    catch (UnsupportedEncodingException e) {
        return new String();
    }
}

//Constructs the request for requesting a bearer token and returns that token as a string
private static void requestAccessToken() throws IOException {
    HttpsURLConnection connection = null;
    String endPointUrl = twitterApiUrl + "/oauth2/token";
    String encodedCredentials = encodeKeys(consumerKey,consumerSecret);
    String key = "";

    try {
        URL url = new URL(endPointUrl);
        connection = (HttpsURLConnection) url.openConnection();           
        connection.setDoOutput(true);
        connection.setDoInput(true); 
        connection.setRequestMethod("POST"); 
        connection.setRequestProperty("Host", "api.twitter.com");
        connection.setRequestProperty("User-Agent", "Your Program Name");
        connection.setRequestProperty("Authorization", "Basic " + encodedCredentials);
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
        connection.setRequestProperty("Content-Length", "29");
        connection.setUseCaches(false);

        writeRequest(connection, "grant_type=client_credentials");

        // Parse the JSON response into a JSON mapped object to fetch fields from.
        JSONObject obj = (JSONObject)JSONValue.parse(readResponse(connection));

        if (obj != null) {
            String tokenType = (String)obj.get("token_type");
            String token = (String)obj.get("access_token");
            accessToken = ((tokenType.equals("bearer")) && (token != null)) ? token : "";
        }
        else {
            accessToken = null;
        }

    }
    catch (MalformedURLException e) {
        throw new IOException("Invalid endpoint URL specified.", e);
    }
    finally {
        if (connection != null) {
            connection.disconnect();
        }
    }
}

private void requestTwitterUserInfo(String sn) throws IOException {

    HttpsURLConnection connection = null;
    if (accessToken == null) {
        requestAccessToken();
    }
    String count = "";

    try {
        URL url = new URL(twitterApiUrl + "/1.1/users/show.json?screen_name=" + sn);
        connection = (HttpsURLConnection) url.openConnection();           
        connection.setDoOutput(true);
        connection.setDoInput(true); 
        connection.setRequestMethod("GET"); 
        connection.setRequestProperty("Host", "api.twitter.com");
        connection.setRequestProperty("User-Agent", "Your Program Name");
        connection.setRequestProperty("Authorization", "Bearer " + accessToken);
        connection.setRequestProperty("Content-Type", "text/plain");
        connection.setUseCaches(false);
    }
    catch (MalformedURLException e) {
        throw new IOException("Invalid endpoint URL specified.", e);
    }
    finally {
        if (connection != null) {
            connection.disconnect();
        }
    }

    twitUser = readResponse(connection);

}

//Writes a request to a connection
private static boolean writeRequest(HttpsURLConnection connection, String textBody) {
    try {
        BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
        wr.write(textBody);
        wr.flush();
        wr.close();

        return true;
    }
    catch (IOException e) { return false; }
}


// Reads a response for a given connection and returns it as a string.
private static String readResponse(HttpsURLConnection connection) {
    try {
        StringBuilder str = new StringBuilder();

        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line = "";
        while((line = br.readLine()) != null) {
            str.append(line + System.getProperty("line.separator"));
        }
        return str.toString();
    }
    catch (IOException e) { return new String(); }
}
}

1 个答案:

答案 0 :(得分:2)

一些指示:

  • Domino具有Apache HTTP客户端类。它们往往比原始HTTP连接更健壮
  • 将新类定义为包含您希望每行查看的所有值的bean。你只需要公开的吸气剂
  • 向托管bean Collection getAllData()
  • 添加一个方法
  • 将其绑定到重复控件
  • 然后您可以在EL中的列值中使用repeatvar.someProperty
    • 使用比我刚使用的更好的名字