从Python发送HTTP POST请求(尝试从PHP转换)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了从Python发送HTTP POST请求(尝试从PHP转换),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2523字,纯文字阅读大概需要4分钟。
内容图文
![从Python发送HTTP POST请求(尝试从PHP转换)](/upload/InfoBanner/zyjiaocheng/753/9459091f42a24d0fa95602bed121e4c4.jpg)
我正在尝试将此代码段从PHP转换为Python(编程新手),并且我发现这样做有困难:
我试图转换的PHP如下:
$fp = fsockopen($whmcsurl, 80, $errno, $errstr, 5);
if ($fp) {
$querystring = "";
foreach ($postfields AS $k=>$v) {
$querystring .= "$k=".urlencode($v)."&";
}
$header="POST ".$whmcsurl."modules/servers/licensing/verify.php HTTP/1.0\r\n";
$header.="Host: ".$whmcsurl."\r\n";
$header.="Content-type: application/x-www-form-urlencoded\r\n";
$header.="Content-length: ".@strlen($querystring)."\r\n";
$header.="Connection: close\r\n\r\n";
$header.=$querystring;
$data="";
@stream_set_timeout($fp, 20);
@fputs($fp, $header);
$status = @socket_get_status($fp);
while (!@feof($fp)&&$status) {
$data .= @fgets($fp, 1024);
$status = @socket_get_status($fp);
}
@fclose ($fp);
}
我编写的相应Python代码如下:
fp = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
fp.connect(("my ip", 80))
if (fp):
querystring = ""
#print postfields
for key in postfields:
querystring = querystring+key+"="+urllib.quote(str(postfields[key]))+"&"
header = "POST "+whmcsurl+"modules/servers/licensing/verify.php HTTP/1.0\r\n"
header+="Content-type: application/x-www-form-urlencoded\r\n"
header+="Content-length: "+str(len(querystring))+"\r\n"
header+="Connection: close\r\n\r\n"
#header+=querystring
data=""
request = urllib2.Request(whmcsurl,querystring,header)
response = urllib2.urlopen(request)
data = response.read()
在这里,我遇到以下错误:
request = urllib2.Request(whmcsurl,querystring,header)
File "/usr/lib64/python2.6/urllib2.py", line 200, in __init__
for key, value in headers.items():
AttributeError: 'str' object has no attribute 'items'
所以我猜测Python期待标题的字典.但PHP将其作为字符串发送.
我可以知道如何解决这个问题吗?
提前致谢
解决方法:
你太过复杂了,相当远. Python会为您处理大部分内容.您无需自己打开套接字,也无需构建标头和HTTP开头行.
from urllib import urlencode
from urllib2 import urlopen
params = urlencode(postfields)
url = whmcsurl + 'modules/servers/licensing/verify.php'
response = urlopen(url, params)
data = response.read()
urlopen()接受第二个参数,即要在POST请求中发送的数据;该库负责计算主体的长度,并设置适当的标题.最重要的是,它使用另一个库httplib来处理套接字连接并生成有效的头和HTTP请求行.
POST主体使用urllib.urlencode()进行编码,它也会为您正确引用.
您可能还想查看external requests library,它仍然提供了一个更易于使用的API:
import requests
response = requests.post(whmcsurl + 'modules/servers/licensing/verify.php', params=params)
data = response.content # or response.text for decoded content, or response.json(), etc.
内容总结
以上是互联网集市为您收集整理的从Python发送HTTP POST请求(尝试从PHP转换)全部内容,希望文章能够帮你解决从Python发送HTTP POST请求(尝试从PHP转换)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。