首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Grinder API通过HTTP PUT请求发送表单数据

使用Grinder API通过HTTP PUT请求发送表单数据
EN

Stack Overflow用户
提问于 2013-03-31 04:44:47
回答 2查看 2.4K关注 0票数 0

我正在尝试使用Grinder复制以下成功的cURL操作。

代码语言:javascript
复制
curl -X PUT -d "title=Here%27s+the+title&content=Here%27s+the+content&signature=myusername%3A3ad1117dab0ade17bdbd47cc8efd5b08" http://www.mysite.com/api

下面是我的脚本:

代码语言:javascript
复制
from net.grinder.script import Test
from net.grinder.script.Grinder import grinder
from net.grinder.plugin.http import HTTPRequest
from HTTPClient import NVPair
import hashlib

test1 = Test(1, "Request resource")
request1 = HTTPRequest(url="http://www.mysite.com/api")
test1.record(request1)
log = grinder.logger.info
test1.record(log)
m = hashlib.md5()

class TestRunner:
    def __call__(self):
        params = [NVPair("title","Here's the title"),NVPair("content", "Here's the content")]
        params.sort(key=lambda param: param.getName())
        ps = ""
    for param in params:
            ps = ps + param.getValue() + ":"
        ps = ps + "myapikey"
        m.update(ps)
        params.append(NVPair("signature", ("myusername:" + m.hexdigest())))
        request1.setFormData(tuple(params))
        result = request1.PUT()

测试运行正常,但是看起来我的脚本实际上并没有向API发送任何params数据,我不知道为什么。没有生成任何错误,但是我从API得到了401 generated响应,这表明成功的PUT请求到达了它,但显然没有签名,请求被拒绝了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-01 21:30:47

这并不是一个确切的答案,更多的是我想出的一个变通办法,我决定发布这个问题,因为这个问题还没有收到任何回应,它可能会对任何其他试图实现同样目标的人有所帮助。

解决方法基本上是使用httplib和urllib模块来构建和发出PUT请求,而不是HTTPClient模块。

代码语言:javascript
复制
import hashlib
import httplib, urllib

....

params = [("title", "Here's the title"),("content", "Here's the content")]
params.sort(key=lambda param: param[0])
ps = ""
for param in params:
    ps = ps + param[1] + ":"
ps = ps + "myapikey"
m = hashlib.md5()
m.update(ps)
params.append(("signature", "myusername:" + m.hexdigest()))

params = urllib.urlencode(params)
print params
headers = {"Content-type": "application/x-www-form-urlencoded"}
conn = httplib.HTTPConnection("www.mysite.com:80")
conn.request("PUT", "/api", params, headers)
response = conn.getresponse()
print response.status, response.reason
print response.read()
conn.close()

(基于this文档页面底部的示例。)

票数 0
EN

Stack Overflow用户

发布于 2013-10-10 09:26:39

您必须参考Grinder脚本库中的多表单发布示例,但将Post更改为Put。这对我很管用。

文件=( NVPair("self","form.py"),)参数=( NVPair("run number",str(grinder.runNumber)),)

代码语言:javascript
复制
    # This is the Jython way of creating an NVPair[] Java array
    # with one element.
    headers = zeros(1, NVPair)

    # Create a multi-part form encoded byte array.
    data = Codecs.mpFormDataEncode(parameters, files, headers)
    grinder.logger.output("Content type set to %s" % headers[0].value)

    # Call the version of POST that takes a byte array.
    result = request1.PUT("/upload", data, headers)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15723289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档