3

urllib2/requests モジュールに完全/絶対 URL の代わりに相対パスを使用させるにはどうすればよいですか??

urllib2/requests を使用してリクエストを送信すると、プロキシで次のように解決されることがわかります。

GET https://xxxx/path/to/something HTTP/1.1

残念ながら、送信先のサーバーはその要求を理解できず、奇妙な 302 が返されます。RFC にあることはわかっていますが、機能しないだけで、Python コードで修正しようとしています。そのサーバーへのアクセス権がありません。

相対パス、うまく機能します

GET /path/to/something HTTP/1.1
Host: xxxx

requests/urllib2 に絶対パスを使用させないようにするにはどうすればよいですか? 単純な相対パスを使用しますか?

4

2 に答える 2

13

おそらく、次のコードがあなたのケースに適しています:

from urlparse import urljoin
import requests

class RelativeSession(requests.Session):
    def __init__(self, base_url):
        super(RelativeSession, self).__init__()
        self.__base_url = base_url

    def request(self, method, url, **kwargs): 
        url = urljoin(self.__base_url, url)
        return super(RelativeSession, self).request(method, url, **kwargs)

session = RelativeSession('http://server.net')
response = session.get('/rel/url')
于 2015-02-05T06:51:24.683 に答える
2

ここで少し混乱があると思います。RFC 2616に従って、絶対パスまたは絶対 URIのみが http 要求行で許可されます。基本的に http はステートレスであるため、相対http 要求などというものはまったくありません。

proxyについて話しているあなたの質問では、RFC は次のことを明確に述べています。

リクエストがプロキシに対して行われている場合は、absoluteURI フォームが必要です。

本質的に、知る限り、プロキシはHTTP/1.1 に準拠していません。これは商用製品ですか、それとも自社開発ですか?

ちなみにHTTP 302はリダイレクトです。リソースが単に別の場所に移動したのではないですか?


とにかく、ソース コードまたはリクエスト( requests/models.py L276 ) を見ると、絶対パスの使用を強制する簡単な方法がないように思えます。

私の最善の策は、高度な使用法/準備された要求PreparedRequestで説明されているように、送信する前にオブジェクトを変更することです。

于 2013-06-11T14:38:34.907 に答える