2012-01-11 7 views
5

estoy en el proceso de escritura de una prueba de concepto de servidor REST utilizando web.pyPrueba de concepto de servidor REST Python (usando web.py) + pruebas con el enrollamiento de

Aquí está la secuencia de comandos:

#!/usr/bin/env python 
import web 
import json 


def notfound(): 
    #return web.notfound("Sorry, the page you were looking for was not found.") 
    return json.dumps({'ok':0, 'errcode': 404}) 

def internalerror(): 
    #return web.internalerror("Bad, bad server. No donut for you.") 
    return json.dumps({'ok':0, 'errcode': 500}) 


urls = (
    '/(.*)', 'handleRequest', 
) 


app = web.application(urls, globals()) 
app.notfound = notfound 
app.internalerror = internalerror 


class handleRequest: 
    def GET(self, method_id): 
     if not method_id: 
      return web.notfound() 
     else: 
      return json.dumps({'ok': method_id}) 

    def POST(self): 
     i = web.input() 
     data = web.data() # you can get data use this method 
     print data 
     pass 

if __name__ == "__main__": 
    app.run() 

Puedo enviar solicitudes GET de forma correcta, sin embargo, cuando intento enviar una solicitud POST, aparece un error interno. Por el momento, no estoy seguro de si el error se debe a que cURL no envió el POST correctamente (muy poco probable), o si mi servidor no se implementó correctamente (más probable).

Este es el comando que utilizo para enviar la solicitud POST:

curl -i -H "Accept: application/json" -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","active":true http://localhost:8080/xx/xxx/xxxx 

Aquí está la respuesta del servidor:

[email protected]:~curl -i -H "Accept: application/json" -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","active":true http://localhost:8080/xx/xxx/xxxx 
HTTP/1.1 500 Internal Server Error 
Content-Length: 1382 
Content-Type: text/plain 

Traceback (most recent call last): 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/wsgiserver/__init__.py", line 1245, in communicate 
    req.respond() 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/wsgiserver/__init__.py", line 775, in respond 
    self.server.gateway(self).respond() 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/wsgiserver/__init__.py", line 2018, in respond 
    response = self.req.server.wsgi_app(self.env, self.start_response) 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/httpserver.py", line 270, in __call__ 
    return self.app(environ, xstart_response) 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/httpserver.py", line 238, in __call__ 
    return self.app(environ, start_response) 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/application.py", line 277, in wsgi 
    result = self.handle_with_processors() 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/application.py", line 247, in handle_with_processors 
    return process(self.processors) 
    File "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/application.py", line 244, in process 
    raise self.internalerror() 
TypeError: exceptions must be old-style classes or derived from BaseException, not str 

¿Cuál es la causa del error - y cómo puedo solucionarlo ?

+0

El mensaje es bastante claro sobre la causa. Nombra el archivo y el número de línea. Archivo "/usr/local/lib/python2.6/dist-packages/web.py-0.36-py2.6.egg/web/application.py", línea 244. Es un error en el código que no ha escrito. Debe hablar con la gente que mantiene web.py. Nosotros no. –

+0

También. ¿Por qué no hay 'retorno' en el método POST? –

+1

Creo que deberías devolver 'web.notfound (json.dumps ({'ok': 0, 'errcode': 404}))' en tu función no encontrada. Se requiere un cambio similar para la función 'internalerror'. –

Respuesta

4

Hay algunos problemas aquí.

1) POST takes 2 arguments (like GET), self and the resource (method_id is fine) 
2) When you're making a POST request you're setting "Content-Type" and not "Accept" 
3) Your JSON isn't in quotes as a string 

Si cambia de POST para (auto, id_método) la siguiente debería funcionar:

curl -i -H "Content-Type: application/json" -X POST -d '{"value":"30","type":"Tip 3","targetModule":"Target 3","active":true}' http://127.0.0.1:8080 

También debe situar el bloque en un try/excepto para detectar errores y hacer algo útil con ellos :

def POST(self,method_id): 
    try: 
     i = web.input() 
     data = web.data() # you can get data use this method 
     return 
    except Error(e): 
     print e 
+0

Gracias Kirsten !. Por cierto, también tuve que corregir mi método POST para devolver un valor, como sugirió S. Lott. Por cierto, ¿podría indicarme la documentación sobre la forma correcta de implementar el método POST ?. Los documentos en la web.py tienen un ejemplo en el que el único argumento para el método POST es uno mismo: de ahí obtuve ese uso. –

+0

http://johnpaulett.com/2008/09/20/getting-restful-with-webpy/ –

Cuestiones relacionadas