diff --git a/app/utils/http.py b/app/utils/http.py index 05f2cc53..270fbf19 100644 --- a/app/utils/http.py +++ b/app/utils/http.py @@ -48,128 +48,159 @@ class RequestUtils: if timeout: self._timeout = timeout - def post(self, url: str, data: Any = None, json: dict = None) -> Optional[Response]: + def request(self, method: str, url: str, raise_exception: bool = False, **kwargs) -> Optional[Response]: + """ + 发起HTTP请求 + :param method: HTTP方法,如 get, post, put 等 + :param url: 请求的URL + :param raise_exception: 是否在发生异常时抛出异常,否则默认拦截异常返回None + :param kwargs: 其他请求参数,如headers, cookies, proxies等 + :return: HTTP响应对象 + :raises: requests.exceptions.RequestException 仅raise_exception为True时会抛出 + """ + if self._session is None: + req_method = requests.request + else: + req_method = self._session.request + kwargs.setdefault("headers", self._headers) + kwargs.setdefault("cookies", self._cookies) + kwargs.setdefault("proxies", self._proxies) + kwargs.setdefault("timeout", self._timeout) + kwargs.setdefault("verify", False) + kwargs.setdefault("stream", False) + try: + return req_method(method, url, **kwargs) + except requests.exceptions.RequestException: + if raise_exception: + raise + return None + + def get(self, url: str, params: dict = None, **kwargs) -> Optional[str]: + """ + 发送GET请求 + :param url: 请求的URL + :param params: 请求的参数 + :param kwargs: 其他请求参数,如headers, cookies, proxies等 + :return: 响应的内容,若发生RequestException则返回None + """ + response = self.request(method="get", url=url, params=params, **kwargs) + return str(response.content, "utf-8") if response else None + + def post(self, url: str, data: Any = None, json: dict = None, **kwargs) -> Optional[Response]: + """ + 发送POST请求 + :param url: 请求的URL + :param data: 请求的数据,表单格式 + :param json: 请求的JSON数据 + :param kwargs: 其他请求参数,如headers, cookies, proxies等 + :return: HTTP响应对象,若发生RequestException则返回None + """ if json is None: json = {} - try: - if self._session: - return self._session.post(url, - data=data, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - json=json, - stream=False) - else: - return requests.post(url, - data=data, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - json=json, - stream=False) - except requests.exceptions.RequestException: - return None + return self.request(method="post", url=url, data=data, json=json, **kwargs) - def get(self, url: str, params: dict = None) -> Optional[str]: - try: - if self._session: - r = self._session.get(url, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - params=params) - else: - r = requests.get(url, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - params=params) - return str(r.content, 'utf-8') - except requests.exceptions.RequestException: - return None + def put(self, url: str, data: Any = None, **kwargs) -> Optional[Response]: + """ + 发送PUT请求 + :param url: 请求的URL + :param data: 请求的数据,表单格式 + :param kwargs: 其他请求参数,如headers, cookies, proxies等 + :return: HTTP响应对象,若发生RequestException则返回None + """ + return self.request(method="put", url=url, data=data, **kwargs) - def get_res(self, url: str, + def get_res(self, + url: str, params: dict = None, data: Any = None, json: dict = None, allow_redirects: bool = True, - raise_exception: bool = False - ) -> Optional[Response]: - try: - if self._session: - return self._session.get(url, - params=params, - data=data, - json=json, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - allow_redirects=allow_redirects, - stream=False) - else: - return requests.get(url, - params=params, - data=data, - json=json, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - allow_redirects=allow_redirects, - stream=False) - except requests.exceptions.RequestException: - if raise_exception: - raise requests.exceptions.RequestException - return None + raise_exception: bool = False, + **kwargs) -> Optional[Response]: + """ + 发送GET请求并返回响应对象 + :param url: 请求的URL + :param params: 请求的参数 + :param data: 请求的数据,表单格式 + :param json: 请求的JSON数据 + :param allow_redirects: 是否允许重定向 + :param raise_exception: 是否在发生异常时抛出异常,否则默认拦截异常返回None + :param kwargs: 其他请求参数,如headers, cookies, proxies等 + :return: HTTP响应对象,若发生RequestException则返回None + :raises: requests.exceptions.RequestException 仅raise_exception为True时会抛出 + """ + return self.request(method="get", + url=url, + params=params, + data=data, + json=json, + allow_redirects=allow_redirects, + raise_exception=raise_exception, + **kwargs) - def post_res(self, url: str, data: Any = None, params: dict = None, + def post_res(self, + url: str, + data: Any = None, + params: dict = None, allow_redirects: bool = True, files: Any = None, json: dict = None, - raise_exception: bool = False) -> Optional[Response]: - try: - if self._session: - return self._session.post(url, - data=data, - params=params, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - allow_redirects=allow_redirects, - files=files, - json=json, - stream=False) - else: - return requests.post(url, - data=data, - params=params, - verify=False, - headers=self._headers, - proxies=self._proxies, - cookies=self._cookies, - timeout=self._timeout, - allow_redirects=allow_redirects, - files=files, - json=json, - stream=False) - except requests.exceptions.RequestException: - if raise_exception: - raise requests.exceptions.RequestException - return None + raise_exception: bool = False, + **kwargs) -> Optional[Response]: + """ + 发送POST请求并返回响应对象 + :param url: 请求的URL + :param data: 请求的数据,表单格式 + :param params: 请求的参数 + :param allow_redirects: 是否允许重定向 + :param files: 请求的文件 + :param json: 请求的JSON数据 + :param kwargs: 其他请求参数,如headers, cookies, proxies等 + :param raise_exception: 是否在发生异常时抛出异常,否则默认拦截异常返回None + :return: HTTP响应对象,若发生RequestException则返回None + :raises: requests.exceptions.RequestException 仅raise_exception为True时会抛出 + """ + return self.request(method="post", + url=url, + data=data, + params=params, + allow_redirects=allow_redirects, + files=files, + json=json, + raise_exception=raise_exception, + **kwargs) + + def put_res(self, + url: str, + data: Any = None, + params: dict = None, + allow_redirects: bool = True, + files: Any = None, + json: dict = None, + raise_exception: bool = False, + **kwargs) -> Optional[Response]: + """ + 发送PUT请求并返回响应对象 + :param url: 请求的URL + :param data: 请求的数据,表单格式 + :param params: 请求的参数 + :param allow_redirects: 是否允许重定向 + :param files: 请求的文件 + :param json: 请求的JSON数据 + :param raise_exception: 是否在发生异常时抛出异常,否则默认拦截异常返回None + :param kwargs: 其他请求参数,如headers, cookies, proxies等 + :return: HTTP响应对象,若发生RequestException则返回None + :raises: requests.exceptions.RequestException 仅raise_exception为True时会抛出 + """ + return self.request(method="put", + url=url, + data=data, + params=params, + allow_redirects=allow_redirects, + files=files, + json=json, + raise_exception=raise_exception, + **kwargs) @staticmethod def cookie_parse(cookies_str: str, array: bool = False) -> Union[list, dict]: @@ -182,15 +213,12 @@ class RequestUtils: if not cookies_str: return {} cookie_dict = {} - cookies = cookies_str.split(';') + cookies = cookies_str.split(";") for cookie in cookies: - cstr = cookie.split('=') + cstr = cookie.split("=") if len(cstr) > 1: cookie_dict[cstr[0].strip()] = cstr[1].strip() if array: - cookiesList = [] - for cookieName, cookieValue in cookie_dict.items(): - cookies = {'name': cookieName, 'value': cookieValue} - cookiesList.append(cookies) - return cookiesList + return [{"name": k, "value": v} for k, v in cookie_dict.items()] return cookie_dict +