10-01-2011, 08:23 PM
(Modification du message : 10-01-2011, 08:25 PM par Sephi-Chan.)
J'vais reprendre le code de cette classe point par point.
D'abord l'ensemble, pour être sûr qu'on parle de la même chose.
Commençons par le début :
Notre classe va utiliser d'autres classes. On n'est pas sûr qu'ils soient déjà inclus, dans le doute, on charge ces classes (la méthode require est protégée contre les inclusions multiples). Ici, j'ai besoin de JSON et de Net::HTTP.
Ici, on génère des accesseurs (writters et readers) pour différentes propriétés. Ça revient à écrire (sauf que cette solution est plus performantes) :
Et ça tu le fais pas en PHP, t'écris (ou tu génères) bêtement tes méthodes, qui prennent de la place inutilement…
Le constructeur de notre classe. Il prend un api_key, une secret_key et une hash d'options. Il donne des valeurs par défaut quand il n'y en a pas. L'équivalent en PHP :
Ah, rien à dire, le Ruby c'est vraiment imbuvable !
Ici, les méthodes qui suivent le mot clé private sont privées. La méthode http est donc privée. Elle instancie un objet Net::HTTP en leur passant host et port. Comme vous pouvez le voir, on n'a défini aucune variable locale host ou port, Ruby va quand même les chercher : il va tenter sa chance en cherchant des méthodes de l'objet qui portent ce nom : et il trouve ! En effet, on a généré des accesseurs et on les a rempli dans le constructeur.
Ici, on a une méthode publish qui prend un channel et des data. On transforme les données en JSON, on génère l'URL du script à appeler. Pour cela, on utilise version, api_key et channel. Comme pour la méthode d'avant, version et api_key appeleront les méthodes de l'objet tandis que channel utilisera la variable locale reçue en argument.
Ensuite, on crée une requête HTTP POST. Pour ça par contre, je vous laisse écrire l'équivalent en PHP avec Curl et le poster dans cette discussion.
Ces requête doit avoir un header X-Beacon-Secret-Key qui contient la clé secrète.
La requête doit également avoir un contenu : ici ce sont nos données à envoyer encodées en JSON et une taille : la longueur du contenu.
La méthode renvoie true si le code de la réponse (200, 301, 404, 500, etc.) est situé entre 200 et 299.
Sephi-Chan
D'abord l'ensemble, pour être sûr qu'on parle de la même chose.
require 'json'
require 'net/http'
class Beacon
attr_accessor :host, :port, :version, :api_key, ecret_key
def initialize(api_key, secret_key, options = {})
self.api_key = api_key
self.secret_key = secret_key
self.host = options[:host] || 'api.beaconpush.com'
self.port = options[:port] || 80
self.version = '1.0.0'
end
def publish(channel, data)
json_data = JSON.dump(data)
path = "/#{version}/#{api_key}/channels/#{channel}"
request = Net::HTTPGenericRequest.new('POST', true , true, path)
request.body = json_data
request.content_length = json_data.size
request['X-Beacon-Secret-Key'] = secret_key
response = http.request(request)
(200...300).include?(response.code.to_i)
end
private
def http
Net::HTTP.new(host, port)
end
end
Commençons par le début :
require 'json'
require 'net/http'
class Beacon
# ...
end
Notre classe va utiliser d'autres classes. On n'est pas sûr qu'ils soient déjà inclus, dans le doute, on charge ces classes (la méthode require est protégée contre les inclusions multiples). Ici, j'ai besoin de JSON et de Net::HTTP.
attr_accessor :host, :port, :version, :api_key, ecret_key
Ici, on génère des accesseurs (writters et readers) pour différentes propriétés. Ça revient à écrire (sauf que cette solution est plus performantes) :
def host
@host
end
def host=(host)
@host = host
end
# Etc. pour les autres propriétés.
Et ça tu le fais pas en PHP, t'écris (ou tu génères) bêtement tes méthodes, qui prennent de la place inutilement…
def initialize(api_key, secret_key, options = {})
self.api_key = api_key
self.secret_key = secret_key
self.host = options[:host] || 'api.beaconpush.com'
self.port = options[:port] || 80
self.version = '1.0.0'
end
Le constructeur de notre classe. Il prend un api_key, une secret_key et une hash d'options. Il donne des valeurs par défaut quand il n'y en a pas. L'équivalent en PHP :
public function __construct($apiKey, $secretKey, $options = array()){
$this->setApiKey($apiKey);
$this->setSecretKey($secretKey);
$this->setHost(array_key_exists('host', $options) ? $options['host'] : "api.beaconpush.com");
$this->setHost(array_key_exists('port', $options) ? $options['port'] : 80);
$this->setVersion('1.0.0');
}
Ah, rien à dire, le Ruby c'est vraiment imbuvable !
private
def http
Net::HTTP.new(host, port)
end
Ici, les méthodes qui suivent le mot clé private sont privées. La méthode http est donc privée. Elle instancie un objet Net::HTTP en leur passant host et port. Comme vous pouvez le voir, on n'a défini aucune variable locale host ou port, Ruby va quand même les chercher : il va tenter sa chance en cherchant des méthodes de l'objet qui portent ce nom : et il trouve ! En effet, on a généré des accesseurs et on les a rempli dans le constructeur.
def publish(channel, data)
json_data = JSON.dump(data)
path = "/#{version}/#{api_key}/channels/#{channel}"
request = Net::HTTPGenericRequest.new('POST', true , true, path)
request.body = json_data
request.content_length = json_data.size
request['X-Beacon-Secret-Key'] = secret_key
response = http.request(request)
(200...300).include?(response.code.to_i)
end
Ici, on a une méthode publish qui prend un channel et des data. On transforme les données en JSON, on génère l'URL du script à appeler. Pour cela, on utilise version, api_key et channel. Comme pour la méthode d'avant, version et api_key appeleront les méthodes de l'objet tandis que channel utilisera la variable locale reçue en argument.
Ensuite, on crée une requête HTTP POST. Pour ça par contre, je vous laisse écrire l'équivalent en PHP avec Curl et le poster dans cette discussion.
Ces requête doit avoir un header X-Beacon-Secret-Key qui contient la clé secrète.
La requête doit également avoir un contenu : ici ce sont nos données à envoyer encodées en JSON et une taille : la longueur du contenu.
La méthode renvoie true si le code de la réponse (200, 301, 404, 500, etc.) est situé entre 200 et 299.
Sephi-Chan