3

我正在尝试在变量“full_req”中构建 HTTP 请求字符串。以下是 HTTP 请求的外观:

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

我已经编写了 python 代码,所以如果我输入一个 URL,“ http://www.google.com/images/logo/googlelogo.png ”,它会将 URL 分成 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/

4

3 回答 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()方法,但您也可以使用经典的字符串操作

于 2013-04-21T21:51:29.890 回答
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。

于 2013-04-21T21:50:43.440 回答
2

尝试:

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

据我所知,该端口不包含在实际的 HTTP 请求中。这里的关键是% 字符串格式化操作符的使用。

于 2013-04-21T21:51:37.693 回答