суббота, 4 мая 2013 г.

Взаимодействие с API и как правильно разбирать JSON в Android

Вообще этот проект я делал для диплома , который еще кстати не защитил :) Так для начала опишу серверную часть .
Имеем БД MySQL с таблицей categories внутри , чтобы получить содержимое таблицы и закодировать в JSON выполним следующее

function getCategories(){
  if(isset($_GET['format']) && intval($_GET['num'])) { 
          $format = strtolower($_GET['format']); 
          $num = intval($_GET['num']); 
  mysql_query('SET NAMES \'UTF8\''); 
  $result = mysql_query('SELECT * FROM categories ORDER BY `category_id` DESC      LIMIT ' . $num) or die('MySQL Error.'); 
  if($format == 'json') { 
      $сategories = array(); 
  while($category = mysql_fetch_array($result, MYSQL_ASSOC)) { 
       $categories[] = array('category'=>$category); } 
       $output = json_encode($categories); echo $output; 
  }
 } 
}

if($_REQUEST['function']=='getCategories') 
   getCategories();



То есть чтобы сделать запрос и получить ответ в JSON в браузере делаем следующее :
http://superquiz.zz.mu/api.php?format=json&num=10&function=getCategories

Так теперь перейдем к клиентской части. Я делал общий класс API у которого будут методы для получения категорий , списка тестов , статистики и т.д . Опишу метод получения категорий.


public class API {    
     private HttpClient client; 
     private HttpGet httpGet; 
     private BufferedReader in; 
     private JSONObject mainJsonObject, innerJsonObject; 
     private ArrayList<Categories> categoriesArr = new ArrayList<Categories>(); 
     private static final String TAG_CATEGORY = "category"; 
     private static final String TAG_CATEGORY_ID = "category_id"; 
     private static final String TAG_CATEGORY_NAME = "category_name"; 
    
     public API() { 
        client = new DefaultHttpClient(); 
     } 
    
     public ArrayList getCategoryQuiz() { 
          httpGet = new HttpGet( "http://superquiz.zz.mu/api.php?  format=json&num=10&function=getCategories"); 
    
     try { 
           HttpResponse response = client.execute(httpGet); 
           in = new BufferedReader(new InputStreamReader(response.getEntity() .getContent())); 
           StringBuffer sb = new StringBuffer(""); 
           String line = ""; 
           while ((line = in.readLine()) != null) { 
                 sb.append(line + "\n"); 
           } 
           in.close(); 
           String result = sb.toString(); 
          
           JSONArray jsonMainArr = new JSONArray(result); 
           for (int i = 0; i < jsonMainArr.length(); i++) { 
           mainJsonObject = jsonMainArr.getJSONObject(i); 
           innerJsonObject = mainJsonObject.getJSONObject(TAG_CATEGORY); 
           int id = Integer.parseInt(innerJsonObject.getString(TAG_CATEGORY_ID));                             String name =  innerJsonObject.getString(TAG_CATEGORY_NAME); 
           categoriesArr.add(new Categories(id, name)); } 
     } catch (Exception e) { 
          e.printStackTrace(); 
     } return categoriesArr; 
 }

Теперь разберем что мы здесь наделали. Делаем GET запрос и получаем JSON ответ записывая его в StringBuilder. Затем формируем JSONArray из нашего ответа. После этого "растаскиваем" наш JSONArray на объекты и добавляем его в ArrayList из категорий. Кому не понятно как создать класс категорий выкладываю. 


public class Categories { 
   private int categoryId; 
   private String categoryName; 
  
   public Categories(int categoryId, String categoryName) { 
       this.categoryId = categoryId; 
       this.categoryName = categoryName; 
   } 

   public int getCategoryId() { 
       return categoryId; 
   } 
  
   public void setCategoryId(int categoryId) { 
       this.categoryId = categoryId; 
   } 
  
   public String getCategoryName() { 
      return categoryName; 
   } 
  
   public void setCategoryName(String categoryName) { 
      this.categoryName = categoryName; 
   } 
 }

Чтобы потом воспользоваться данным методом который мы написали делаем следующее.  API api = new API(); categoriesArr = api.getCateroiesQuiz();
Вроде все что хотел написал , за серверную часть не пинать :) В PHP особо никогда не углублялся , поэтому написал просто , без аутентификаций и т.д. В следующем уроке планирую разобрать AsyncTask и как отобразить полученные данные в ListView.

1 комментарий: