需求是使用给定的JSON有效负载向特定URL发出POST请求。URL只有在有效负载正确且请求是通过POST的情况下才会响应。
这是我的代码:
request1 = HTTPRequest()
control = HTTPPluginControl.getConnectionDefaults()
httpUtilities = HTTPPluginControl.getHTTPUtilities()
control.setProxyServer("proxy.example.com", 1234)
payload = JSONObject({
"uaaURL": "https://com-example.something.com",
"sampleID": "admin",
"sampleSecret": "password",
"sampleID2": "example-sample-el",
"sampleSecret2": "ssenjsoemal/+11=",
"username": "test",
"someAttributes": {
"Groups": [
"example_com-abc"
],
"attribute": [
"value1"
]
}
})
payload = str(payload)
url = "https://example-something.com:6443/getvalues"
headers = [
NVPair('Content-Type', 'application/json'),
NVPair('Charset', 'UTF-8'),]
class TestRunner:
def __call__(self):
result = request1.POST(url, payload, headers)
print payload, headers
现在的问题是,我的POST请求给我一个403禁止。但是,当我使用相同的有效负载并使用DHC发送请求时,它会给我一个200。所以我确定有效载荷和连接的链接。我还在另一个脚本中测试了代理,并且工作良好。此外,如果代理不起作用,我也不会得到403。最后,我将其解析为字符串,因为POST要求第二个参数为字符串,它将在内部转换为byte[]。
我真的不明白发生了什么,所以任何见解都会非常有帮助。提前感谢
编辑:提琴手捕获DHC的请求
POST https://example-something.com:6443/getvalues HTTP/1.1
Host: example-something.com:6444
Connection: keep-alive
Content-Length: 688
Origin: chrome-extension://aejoelaoggembcahagimdiliamlcdmfm
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
{
"uaaURL": "https://com-example.something.com",
"sampleID": "admin",
"sampleSecret": "password",
"sampleID2": "example-sample-el",
"sampleSecret2": "ssenjsoemal/+11=",
"username": "test",
"someAttributes": {
"Groups": [
"example_com-abc"
],
"attribute": [
"value1"
]
}
}
我甚至将Grinder请求头编辑为so
headers = (
NVPair('Content-Type', 'application/json'),
NVPair('Charset','UTF-8'),
NVPair('Accept', '*/*'),
NVPair('Accept-Encoding', 'gzip, deflate, br'),
NVPair('Accept-Language', 'en-US,en;q=0.8'),
NVPair('Connection', 'keep-alive'),
)
最佳猜测?您可能丢失了一个带有一些凭据信息的标头,以便将代理/防火墙/访问门传递给应用程序。您的REST客户机DHC可能会传递这些额外的数据,但grinder不会。抓一个代理(Fiddler, Charles等),检查从DHC到目的地的握手,然后与Grinder匹配。我猜你会找到的
问题是Grinder无法访问端口。它与JSON无关。在端口6443上运行的URL是问题所在,Grinder无法访问它(不知道为什么)。我将URL本身更改为在默认端口8080上运行,脚本立即工作。谢谢你的帮助!