Diferència entre revisions de la pàgina «Web Services»
Salta a la navegació
Salta a la cerca
(Es crea la pàgina amb « == Introducció == Un '''servei web''' ve a ser un servei més del sistema informàtic (o sigui, un sistema d'intercanvi d'informació), però amb algunes peculiaritats…».) |
|||
Línia 73: | Línia 73: | ||
cherrypy.engine.start() | cherrypy.engine.start() | ||
cherrypy.engine.block() | cherrypy.engine.block() | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | == Exemple en Python i Pyramid == | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | @view_config(route_name='xat_set_missatge_ws', renderer='jsonp') | ||
+ | def xat_set_missatge_ws(request): | ||
+ | try: | ||
+ | # ho intentem per GET (JSONP) | ||
+ | remitent = request.GET.get("remitent") | ||
+ | missatge = request.GET.get("missatge") | ||
+ | if remitent and missatge: | ||
+ | if remitent.strip() and missatge.strip(): | ||
+ | linia = remitent + "\t" + missatge | ||
+ | else: | ||
+ | # ho intentm per POST (JSON) | ||
+ | dades = request.json_body | ||
+ | linia = dades["remitent"] + "\t" + dades["missatge"] | ||
+ | if "<" in linia or "\n" in linia: | ||
+ | return { | ||
+ | "servei":"xat", | ||
+ | "canal":"principal", | ||
+ | "status":False, | ||
+ | "missatge":"ERROR: caracters ilegals" | ||
+ | } | ||
+ | file = open(STORAGE_FILENAME,"a+") | ||
+ | file.write(linia+"\n"); | ||
+ | file.close() | ||
+ | |||
+ | except ValueError: | ||
+ | return {"servei":"xat", | ||
+ | "canal":"principal", | ||
+ | "status":False, | ||
+ | "missatge":"ERROR: JSON incorrecte" | ||
+ | } | ||
+ | except Exception as e: | ||
+ | print type(e).__name__ | ||
+ | print e.args | ||
+ | return {"servei":"xat", | ||
+ | "canal":"principal", | ||
+ | "status":False, | ||
+ | "missatge":"ERROR desonegut: " + type(e).__name__ | ||
+ | } | ||
+ | |||
+ | return { "servei":"xat", | ||
+ | "canal":"principal", | ||
+ | "status":True, | ||
+ | "missatge":"missatge enregistrat correctament" | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Revisió del 14:12, 25 abr 2014
Introducció
Un servei web ve a ser un servei més del sistema informàtic (o sigui, un sistema d'intercanvi d'informació), però amb algunes peculiaritats:
- Utilitza el protocol HTTP per intercanviar les dades.
- Utilitza els mètodes HTTP: GET, POST, PUT, DELETE (inspirat en el CRUD de les BBDD).
- Pot tenir altres mètodes (arbitraris) però no és tan usual.
- Sol aplicar-se a sistemes navegables (enllaços/hipervincles).
- Sol estar al port 80
- Sol utiltizar una arquitectura REST o REpresentational State Transfer.
- Arquitectura client-servidor
- Sense estat
- Cachejable
- Per capes
- Codi "on demand": compartit (al client, p.ex. javascript)
- Interfície uniforme
Avantatges:
- Estandarització
- ...
Exemple en Python i CherryPy
En Python solem utiltizar la llibreria json o bé simplejson.
Els mètodes més importants son:
- json.loads
- json.dumps
En moltes ocasions, els propis "renderers" del nostre framework ens faran aquesta feina, tot i que estan utilitzant aquesta llibreria.
# http://www.cherrypy.org/
# http://docs.cherrypy.org/en/latest/tutorial/REST.html
import cherrypy, json
class Xat:
exposed = True
# llistar missatges
def GET(self,*args,**kwargs):
# processem parametres
canal = kwargs.get("canal")
# preparem resposta
resposta = {}
resposta["status"] = False
resposta["missatge"] = "Servei no implementat (encara). Canal=" + str(canal)
return json.dumps( resposta )
# enviar missatges
@cherrypy.tools.json_in()
def POST(self,*args,**kwargs):
dades = cherrypy.request.json
# "dades" conte elements JSON deserialitzats amb dicts, llista, etc.
resposta = {}
resposta["status"] = True
resposta["missatge"] = "Missatge llegit correctament: " + str(dades)
return json.dumps( resposta )
# crida cURL
# curl http://localhost:8080/api/xat -d '"hola"' -H "Content-Type: application/json"
if __name__ == '__main__':
cherrypy.tree.mount(
Xat(), '/api/xat',
{'/':
{'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
}
)
cherrypy.engine.start()
cherrypy.engine.block()
Exemple en Python i Pyramid
@view_config(route_name='xat_set_missatge_ws', renderer='jsonp')
def xat_set_missatge_ws(request):
try:
# ho intentem per GET (JSONP)
remitent = request.GET.get("remitent")
missatge = request.GET.get("missatge")
if remitent and missatge:
if remitent.strip() and missatge.strip():
linia = remitent + "\t" + missatge
else:
# ho intentm per POST (JSON)
dades = request.json_body
linia = dades["remitent"] + "\t" + dades["missatge"]
if "<" in linia or "\n" in linia:
return {
"servei":"xat",
"canal":"principal",
"status":False,
"missatge":"ERROR: caracters ilegals"
}
file = open(STORAGE_FILENAME,"a+")
file.write(linia+"\n");
file.close()
except ValueError:
return {"servei":"xat",
"canal":"principal",
"status":False,
"missatge":"ERROR: JSON incorrecte"
}
except Exception as e:
print type(e).__name__
print e.args
return {"servei":"xat",
"canal":"principal",
"status":False,
"missatge":"ERROR desonegut: " + type(e).__name__
}
return { "servei":"xat",
"canal":"principal",
"status":True,
"missatge":"missatge enregistrat correctament"
}