restful etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
restful etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

12 Ekim 2012 Cuma

Datasnap rest sunucusu ile iletişim(Android Client)

Daha önce iOS(Objective-C) ortamından erişip bir UITableView nesnesi servisten gelen json veriyi yazdırmıştık. Şimdi ise Android(Java) ortamından datasnap server'a erişip bir listview nesnesine nasıl okuyabiliriz.Bunu öğrenicez. Datasnap Uygulaması oluştururken "Mobile Connectors" seçeneğini seçip devam ettiğiniz de size ilgili platformların mini frameworklerini de oluşturuyor.objective-c için SBJson ismindeki framework örnek verilebilir. Yine android(java) için Embarcadero firmasının yazdığı com.embarcedero.javaandroid paketi(mini framework diyebiliriz) Yukarıda bahsettiğim frameworkleri datasnap uygulamanızı oluştururken "Mobile Connectors" seçeneğini işaretlediğinizde projenizin dizininde "proxy" klasöründe ilgili frameworkü bulabilirsiniz.

 activity_main.xml



    
    


MainActivity.java

package com.datasnap.restfulclient;

import java.io.IOException;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
      
        try {
   this.bindListView();
  } catch (ClientProtocolException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (JSONException e) {
   e.printStackTrace();
  }
    }
    
    
    private void bindListView() throws ClientProtocolException, IOException, JSONException{
     ArrayList list=this.GetPersonList();
   
        ArrayAdapter arrayAdapter =      
                new ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
                      
        final ListView listView1=(ListView)this.findViewById(R.id.listView1);
        listView1.setAdapter(arrayAdapter);
    }
    
    
    
    private ArrayList GetPersonList() throws ClientProtocolException, IOException, JSONException{
     ArrayList list=new ArrayList();
     String json=this.getDataFromRest("http://192.168.0.16:8080/datasnap/rest/TServerMethods1/GetPersonList");
     JSONObject jsonObject=new JSONObject(json);
     JSONArray arrayLevel1=jsonObject.getJSONArray("result");
     JSONArray arrayLevel2=(JSONArray)arrayLevel1.get(0);
     for(int I=0; I< arrayLevel2.length(); I++){
      JSONObject items=(JSONObject)arrayLevel2.getJSONObject(I);
      String firstName=items.get("firstname").toString();
      String lastName=items.get("lastname").toString();
      list.add(firstName+" "+lastName);
     }
     return list;
    }
    
    
    
    private String getDataFromRest(String httpUrl) throws ClientProtocolException,IOException{
     HttpClient httpClient=new DefaultHttpClient();
     HttpGet httpMethod=new HttpGet(httpUrl.toString());
     httpMethod.setHeader("Content-type", "application/json");
     HttpResponse httpResponse=httpClient.execute(httpMethod);
     int status=httpResponse.getStatusLine().getStatusCode();
     if (status==200){
      HttpEntity entity=httpResponse.getEntity();
      String data=EntityUtils.toString(entity);
      return data;
     }else{
      return null;
     }
    }
    
    
 

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}



AndroidManifest.xml dosyasına çift tıklayıp gelen ekrandan "Permissions" sekmesinden "android.permission.INTERNET" değerini ekliyorsunuz. Ekledikten sonra AndroidManifest.xml dosyasının içeriği aşağıdaki gibi olacaktır.

 AndroidManifest.xml



    
    

    
        
            
                

                
            
        
    



Eğer yukarıdaki "android.permission.INTERNET" değerini eklemez iseniz android uygulamanız datasnap rest sunucunuza erişmeyecektir.


İyi Çalışmalar.

25 Eylül 2012 Salı

Datasnap rest sunucusu ile iletişim(iOS Client)

Daha önce TDataset class'ına uzanım fonksiyonu olarak yazdığım ToJSONData isminde bir fonksiyonum vardı.Bu fonksiyon sayesinde veritabanında ki verileri kolayca json formatına çevirip dışarı sunabiliyordum.

Bu servislere de iOS ortamından erişmeyi görücez.

Person.h

@interface Person : NSObject
    @property(nonatomic) NSInteger rid;
    @property(nonatomic,retain) NSString *firstname;
    @property(nonatomic,retain) NSString *lastname;
@end

Person.m

#import "Person.h"

@implementation Person
  @synthesize rid;
  @synthesize firstname;
  @synthesize lastname;
@end

mainViewController.m

#import "mainViewController.h"
#import "Person.h"
#import "SBJson.h"

@interface mainViewController ()
  
@end

Person *person;
NSMutableArray * personlist;

@implementation mainViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
               
    personlist=[NSMutableArray new]; 
    NSURL *url = [[NSURL alloc] 
                  initWithString:@"http://192.168.1.7:8080/datasnap/rest/TServerMethods1/GetPersonList"];
    NSError *error = nil;
    NSStringEncoding encoding;
    NSString *rawjson = [[NSString alloc] initWithContentsOfURL:url
                                                   usedEncoding:&encoding 
                                                          error:&error];
    //formatting : [NSString stringWithFormat:@"%d", rawjson.length];
    if (rawjson.length!=0){
        SBJsonParser * parser=[SBJsonParser new];  
        NSDictionary *jsonObject = [parser objectWithString:rawjson error:&error];
    
        NSArray *mainlist = [jsonObject objectForKey:@"result"];
        NSArray *innerlist= [mainlist objectAtIndex:0];
        
        for (NSDictionary *item in innerlist) {
            person =[Person new];
            person.rid=[[item objectForKey:@"rid"] integerValue];
            person.firstname=[item objectForKey: @"firstname"]; 
            person.lastname=[item objectForKey: @"lastname"]; 
            [personlist addObject:person]; 
        }
    }
    // Uncomment the following line to preserve selection between presentations.
    // self.clearsneSelectionOnViewWillAppear = NO;
 
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    //warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
 //warning Incomplete method implementation.
    // Return the number of rows in the section.
    return [personlist count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    // Configure the cell...
    Person * personItem=[personlist objectAtIndex:indexPath.row]; 
    cell.textLabel.text=[NSString stringWithFormat:@"%@ %@",
                         [personItem firstname],[personItem lastname]];
    return cell;
}




Demo :





Kaynaklar :

http://json.org/
http://stig.github.com/json-framework/
http://docwiki.embarcadero.com/RADStudio/en/DataSnap_REST_Messaging_Protocol
http://jasarien.com/?p=428
http://stackoverflow.com/questions/4919249/how-to-parse-json-into-objective-c-sbjson
http://stackoverflow.com/questions/3995519/how-to-use-stringwithcontentsofurlencodingerror
http://stackoverflow.com/questions/12567491/how-to-parse-this-json-data-with-objective-c-sbjsonparser

Hadi hayırlı işler. :)

Datasnap rest sunucusu ile iletişim(Delphi Client)

Forma bir tane TIdHttp nesnesi ekliyorsunuz.Daha sonra;
 //http://host:port/datasnap/rest/[ClassName]/[MethodName]/[ParamValue
 Memo1.Text:=IdHTTP1.Get('http://localhost:8080/datasnap/rest/TServerMethods1/GetPersonList');

Datasnap REST iletişim protokolü ve detaylar hakkında buradan malümat edinebilirsiniz

10 Eylül 2012 Pazartesi

TDataset ToJSONData

{ İsmail Kocacan }
unit uJsonHelper;

interface

uses

  Data.DB,
  System.SysUtils,
  Data.DBXJSON,
  Data.DBXJSONCommon,
  Data.DBXJSONReflect;

type

  TDatasetJSONHelper = class helper for TDataset
  public
    function ToJSONData: TJSONArray;
  end;

implementation

{ TDatasetJSONHelper }
function TDatasetJSONHelper.ToJSONData: TJSONArray;
var
  jso: TJSONObject;
  jsa: TJSONArray;
  jsp: TJsonPair;
  J: Integer;
begin
  Self.Open;
  jsa := TJSONArray.Create();
  while not Self.Eof do
  begin
    jso := TJSONObject.Create();
    for J := 0 to FieldCount - 1 do
      jso.AddPair(TJsonPair.Create(Fields[J].DisplayName, Fields[J].Value));
    jsa.AddElement(jso);
    Self.Next;
  end;
  Self.Close;
  Result := jsa;
end;

end.
TDataset sınıfına uzanım fonksiyonu olarak yazmamızın sebebi; TDataset sınıfı kullanılarak genişletilen(kalıtılan) üst sınıflarda da,kolayca kullanabilelim diyedir.
 Örneğin ;
 SQLQuery1.ToJSONData;
 ADOQuery1.ToJSONData;
 UniQuery1.ToJSONData;
 BilmemNeQuery1.ToJSONData;

 Şeklinde kullanabilmek mümkün olacaktır.
 Örnek Çıktı
{
 "result":
  [
   {"RID":"3","FIRSTNAME":"serdar","LASTNAME":"sezer"},
   {"RID":"2","FIRSTNAME":"kemal","LASTNAME":"bayat"},
   {"RID":"1","FIRSTNAME":"ismail","LASTNAME":"kocacan"}
  ]
}
Yukarıdaki çıktıyı alabilmek için bir takım düzenlemeler yapmak gerekiyor.Bu düzenlemeleri Datasnap REST Ve JSON Formatı Hakkında konusunda bulabilirsiniz.