Simple code snippet, used for retrieving a users account data, using the Guild Wars 2 API Version 2. Hopefully, this code will help others to overcome similar problems which I was facing while learning how to program in Android.
First thing you will need is the JSONFunctions.java class:
import android.content.Context; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class JSONFunctions { static JSONObject jObj; static JSONArray jArray; protected static String readResource (Context ctx, String filename) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader input = new BufferedReader(new InputStreamReader(ctx.getAssets().open(filename), "utf-8"), 8192); String currLine; while ((currLine = input.readLine()) != null) { sb.append(currLine); } input.close(); return sb.toString(); } public static JSONArray getJSONFromResource (Context ctx, String filename) throws IOException { try { String json = readResource(ctx, filename); jArray = new JSONArray(json); } catch (JSONException e) { e.printStackTrace(); } return jArray; } protected static String readURL (String url) throws IOException { StringBuilder sb = new StringBuilder(); URL requestUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) requestUrl.openConnection(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"), 8192); String line; while ((line = input.readLine()) != null) { sb.append(line); } input.close(); } return sb.toString(); } public static JSONObject getJSONFromURL (String url) throws IOException { try { String json = readURL(url); jObj = new JSONObject(json); } catch (JSONException e) { e.printStackTrace(); } return jObj; } public static String HTTPGetFromKey (String apikey) throws IOException { StringBuilder sb = new StringBuilder(); URL requestUrl = new URL("https://api.guildwars2.com/v2/account"); HttpURLConnection conn = (HttpURLConnection) requestUrl.openConnection(); conn.addRequestProperty("Authorization", "Bearer " + apikey); conn.setAllowUserInteraction(false); conn.setInstanceFollowRedirects(true); conn.setRequestMethod("GET"); conn.connect(); if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"), 8192); String line; while ((line = input.readLine()) != null) { sb.append(line); } input.close(); conn.disconnect(); } return sb.toString(); } public static JSONObject getJSONFromUserKey (String key) throws IOException { try { String json = HTTPGetFromKey(key); jObj = new JSONObject(json); } catch (JSONException e) { e.printStackTrace(); } return jObj; } }
Next, we need the UserInfo.java class (this will also save all the clients guild names):
import android.util.SparseArray; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; public class UserInfo { static String apiKey; static String userID; static String accountName; static int world; static int guildCount; static SparseArray guildIDs; static SparseArray guildNames; static SparseArray guildTag; static String acctCreated; public static void init (String clientKey) { try { JSONObject jUser = JSONFunctions.getJSONFromUserKey (clientKey); apiKey = clientKey; userID = jUser.getString("id"); accountName = jUser.getString("name"); world = jUser.getInt("world"); JSONArray jGuilds = jUser.getJSONArray("guilds"); JSONObject jGuildInfo; guildCount = jGuilds.length (); String guildID; if (guildCount > 0) { guildIDs = new SparseArray<>(); guildNames = new SparseArray<>(); guildTag = new SparseArray<>(); for (int i=0; i < guildCount; i++) { guildID = jGuilds.getString(i); guildIDs.put(i,guildID); // This also retrieves the clents guild names jGuildInfo = JSONFunctions.getJSONFromURL("https://api.guildwars2.com/v1/guild_details.json?guild_id=" + guildID); guildNames.put (i, jGuildInfo.getString("guild_name")); guildTag.put (i,jGuildInfo.getString("tag")); } } acctCreated = jUser.getString ("created"); } catch (JSONException | IOException e) { e.printStackTrace(); } } }
To get a users account info, all you need to do is call:
UserInfo.init(apiKey);
This will return the JSONObject of the current users account, from their personal API-Key.
Note: You can create an API-Key on the official Guild Wars 2 site. Read up more about the return JSONObject format on the GW2 official wiki.
I hope this helps out anyone new to Android and not familiar on the HTTP protocol.