从Python向网络服务发送POST请求

3 投票
6 回答
15574 浏览
提问于 2025-04-16 23:57

我正在尝试向一个RESTful网络服务发送一个POST请求。我需要在请求中传递一些json数据。下面这个curl命令可以正常工作:

curl --basic -i --data '<json data string here>' -H Content-type:"text/plain" -X POST http://www.test.com/api

我需要一些帮助,想知道如何用Python来发送这个请求。目前我有以下的代码:

import urllib
url='http://www.test.com/api'
params = urllib.urlencode... #What should be here ?
data = urllib.urlopen(url, params).read()

我有以下三个问题:

  1. 这样发送请求是对的吗?
  2. 我应该怎么指定参数的值?
  3. 需要指定内容类型吗?

请帮帮我,谢谢!

6 个回答

1

这个问题是关于如何以“json”格式发送参数的。你需要在请求的头部设置内容类型为 application/json,然后直接发送参数,不需要进行 URL 编码。

例如:

url = "someUrl"

data = { "data":"ur data"}


header = {"Content-Type":"application/json","User-Agent":"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"}

#lets use httplib2

import httplib2 
http = httplib2.Http()

response, send = http.request(url,"POST",headers=header,body=data)
1
  1. 先创建一个 dict,里面放你想要通过POST请求发送的数据。
  2. urlencode 把这个字典转换成字符串。
  3. 然后用 urlopen 打开你想要的URL,同时把刚才转换好的字符串作为可选的 data 参数传进去,作为POST数据。
2

httplib的文档里有一个示例,展示了如何发送一个POST请求。

>>> import httplib, urllib
>>> params = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("bugs.python.org")
>>> conn.request("POST", "", params, headers)
>>> response = conn.getresponse()
>>> print response.status, response.reason
302 Found
>>> data = response.read()
>>> data
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>'
>>> conn.close()

撰写回答