微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

概念证明使用cURL进行RESTful Python服务器(使用web.py)测试

我正在使用web.py编写概念验证RESTful服务器

这是脚本:

#!/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()

我可以发送GET请求,但是当我尝试发送POST请求时,我收到内部错误.目前,我不确定错误是由于cURL没有正确发送POST(极不可能),或者我的服务器是否未正确实现(更有可能).

这是我用来发送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

这是服务器响应:

me@localhost:~curl -i -H "Accept: application/json" -X POST -d "value":"30","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,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

错误的原因是什么 – 我该如何解决

解决方法

这里有一些问题.

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

如果您将POST更改为(self,method_id),则以下内容应该有效:

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

您还应该在try / except中包装块以捕获错误并对它们执行一些有用的操作:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐