天天看点

python post提交给php,从Python发送HTTP POST请求(尝试从PHP转换)

我正在尝试将此代码段从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: "[email protected]($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 ([email protected]($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,php,porting,http-headers

来源: https://codeday.me/bug/20190723/1508961.html