2013-04-21 2 views
2

Я пытаюсь построить строку запроса HTTP в переменной "full_req". Вот как запрос HTTP выглядит:Python - Строка переменной строки запроса HTTP

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

Я уже писал код питона, так что если я ввожу URL, «http://www.google.com/images/logo/googlelogo.png», он разделит URL в 3-х частей. Ниже приведены переменные, которые я использовал:

  • host (содержит www.google.com)
  • path (содержит /images/logo/)
  • file (содержит googlelogo.png)
  • port (Его показ None, но я думаю, что его предположим сказать 80)

Как d o Я назначаю строку запроса HTTP для переменной full_req, поэтому, если я печатаю эту переменную, она содержит все три строки?

print(full_req) 

Попробовал конкатенацию строк, но это не сработало. Я использовал этот ресурс: http://www.skymind.com/~ocrow/python_string/

+2

Какую цель вы ставите перед собой? Если вы просто пытаетесь сделать запрос, вам лучше использовать [urllib2] (http://docs.python.org/2/library/urllib2)/[urllib] (http://docs.python.org/3 /library/urllib.request.html) или [запросы] (http://docs.python-requests.org) ... – mata

+1

Знаете ли вы, что Python поставляется с модулем ['urlparse'] (http://docs.python.org/2/library /urlparse.html)? –

ответ

3

Вы можете использовать строку форматирования:

request = 'GET {path} HTTP 1.1\r\nHost: {host}\r\nConnection: Close\r\n\r\n'.format(path=path, host=host) 

Это использует современный str.format() method, но вы можете использовать classic string operations, а также.

+0

Отсутствует HTTP 1.1, но работает .. Спасибо – Damon

3

. , Строковый формат или простая конкатенация должны это сделать.

. , Есть много вариантов, и это зависит от версий. В Python2 обычно используется % operator syntax, но в Python3 вы в основном используете .format method on string objects.

. , Вы все еще можете использовать самую простую форму конкатенации с оператором +, с чем-то вроде этого:

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

. , Обратите внимание, что он не будет запрашивать файл (в соответствии с вашим примером вы запрашиваете родительскую папку, а не сам файл), и если вы планируете загрузить файл, а не просто экспериментировать с протоколом HTTP, есть встроенные модули это (проверка urllib.retrieve).

. , Номер порта (обычно 80 для HTTP) будет использоваться при открытии соединения (в сокете), но ваш пример, похоже, тоже не выполняет эту часть запроса.

. Amplexos.

+0

Обратите внимание, что конкатенация строк более громоздка, чем форматирование строк. В противном случае, хорошие моменты. –

+0

Я на самом деле пытаюсь отобразить изображение на экране. Зачем мне нужен файл? – Damon

+0

Вам не нужно сохранять файл на диск; названные библиотеки могут помочь вам достичь того, чего вы хотите. –

2

Try:

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

Насколько мне известно, порт не входит в фактический запрос HTTP. Ключевым моментом здесь является использование %string formatting operator.

+0

Хорошо, что ваш файл может использовать линейные разрывы «\ n» - только (linux style), но [RFC2616 определяет «правый» разрыв строки как «\ r \ n "] (http://stackoverflow.com/questions/5757290/http-header-line-break-style), поэтому лучше настроить разрывы вручную. –

+0

@DiegoNunes: Спасибо за ссылку, я на самом деле понятия не имел! Я изменю ответ. –

+0

Не сохраняя HTTP-запрос в переменной tho – Damon

Смежные вопросы