Python-构建HTTP请求字符串变量

3

我正在尝试在变量“full_req”中构建HTTP请求字符串。 HTTP请求的格式如下:

GET /images/logo/ HTTP/1.1
Host: www.google.com
Connection: close

我已经编写了Python代码,如果我输入一个网址“http://www.google.com/images/logo/googlelogo.png”,它将把网���分成3部分。下面是我使用的变量:
  • host(包含www.google.com
  • path(包含/images/logo/
  • file(包含googlelogo.png
  • port(显示为 None ,但我认为应该显示80
如何将HTTP请求字符串分配给full_req变量,以便如果我打印此变量,则其包含所有三行?
print(full_req)

尝试了字符串拼接,但不起作用。 我使用了这个资源:http://www.skymind.com/~ocrow/python_string/


2
你的目标是什么?如果你只是想发起一个请求,最好使用urllib2/urllib或者requests... - mata
1
你知道Python自带一个urlparse模块吗? - Martijn Pieters
3个回答

4
你可以使用字符串格式化:
request = 'GET {path} HTTP 1.1\r\nHost: {host}\r\nConnection: Close\r\n\r\n'.format(path=path, host=host)

这里使用现代的str.format()方法,但你也可以使用经典的字符串操作

3

. .使用字符串格式化或简单的连接操作即可。

. . 有许多选项,这取决于版本。在Python2中,通常使用%运算符语法,但在Python3中,您主要使用字符串对象上的.format方法

. . 您仍然可以使用最简单的连接操作,使用+运算符,类似于以下内容:

full_req = 'GET ' + path + ' HTTP/1.1\r\n' \
           'HOST: ' + host + '\r\n' + \
           'Connection: close'

请注意,它不会请求文件(根据您的示例,您正在请求父文件夹,而不是文件本身),如果您计划下载文件而不仅仅是试验HTTP协议,则有内置模块可以执行此操作(请查看urllib.retrieve)。
端口号(通常为HTTP的80)将在打开连接时(在套接字中)使用,但您的示例似乎没有完成该请求的这部分内容。
Amplexos。

请注意,字符串拼接比字符串格式化更繁琐。除此之外,观点不错。 - Martijn Pieters
我实际上正在尝试在屏幕上显示一张图片。为什么需要保存文件? - Damon
您不必将文件保存到磁盘上;命名的库仍然可以帮助您实现所需的功能。 - Martijn Pieters

2

尝试:

def request(host, path, file):
    return '''GET %s%s HTTP/1.1\r
Host: %s\r
Connection: close''' % (path, file, host)

据我所知,端口号并没有包含在实际的HTTP请求中。关键在于使用了 % 字符串格式化操作符

很好,你清楚地表明了你的文件可以使用“\n”(Linux风格)换行符,但是RFC2616定义了“正确”的换行符为“\r\n”,因此最好手动设置换行符。 - diego nunes
@DiegoNunes:感谢提供链接,我之前完全不知道!我会修改回答。 - Lucas Jones
它没有将HTTP请求存储在变量中。 - Damon
在定义函数后,使用req = request(host, path, file)将结果存储到变量中。或者,只需编写req ='''GET %s%s HTTP/1.1\r等。 - Lucas Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接