- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个反向代理来与某些 API(如 Twitter、Github、Instagram)对话,然后我可以使用我的反向代理调用我想要的任何(客户端)应用程序(将其视为 API -经理)。
此外,我正在使用 LXC 容器来执行此操作。
例如,这是我从 Twisted Docs 上的示例中破解的最简单的代码:
from twisted.internet import reactor
from twisted.web import proxy, server
from twisted.python.log import startLogging
from sys import stdout
startLogging(stdout)
site = server.Site(proxy.ReverseProxyResource('https://api.github.com/users/defunkt', 443, b''))
reactor.listenTCP(8080, site)
reactor.run()
当我在容器内执行 CURL 操作时,我得到了一个有效请求(意味着我得到了适当的 JSON 响应)。
这是我使用 CURL 命令的方式:
curl https://api.github.com/users/defunkt
这是我得到的输出:
{
"login": "defunkt",
"id": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/2?v=3",
"gravatar_id": "",
"url": "https://api.github.com/users/defunkt",
"html_url": "https://github.com/defunkt",
"followers_url": "https://api.github.com/users/defunkt/followers",
"following_url": "https://api.github.com/users/defunkt/following{/other_user}",
"gists_url": "https://api.github.com/users/defunkt/gists{/gist_id}",
"starred_url": "https://api.github.com/users/defunkt/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/defunkt/subscriptions",
"organizations_url": "https://api.github.com/users/defunkt/orgs",
"repos_url": "https://api.github.com/users/defunkt/repos",
"events_url": "https://api.github.com/users/defunkt/events{/privacy}",
"received_events_url": "https://api.github.com/users/defunkt/received_events",
"type": "User",
"site_admin": true,
"name": "Chris Wanstrath",
"company": "GitHub",
"blog": "http://chriswanstrath.com/",
"location": "San Francisco",
"email": "chris@github.com",
"hireable": true,
"bio": null,
"public_repos": 107,
"public_gists": 280,
"followers": 15153,
"following": 208,
"created_at": "2007-10-20T05:24:19Z",
"updated_at": "2016-02-26T22:34:27Z"
}
但是,当我尝试使用 Firefox 获取代理时:
我得到:“无法连接”
这是我的 Twisted 日志的样子:
2016-02-27 [-] Log opened.
2016-02-27 [-] Site starting on 8080
2016-02-27 [-] Starting factory
2016-02-27 [-] Starting factory
2016-02-27 [-] "10.5.5.225" - - [27/Feb/2016: +0000] "GET / HTTP/1.1" 501 26 "-" "Mozilla/5.0 (X11; Debian; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0"
2016-02-27 [-] Stopping factory
我如何使用 Twisted 进行 API 调用(无论如何现在大多数 API 都是 HTTPS)并获得所需的响应(基本上,“200”响应/JSON 应该是什么)?
我试着看这个问题:Convert HTTP Proxy to HTTPS Proxy in Twisted
但从编码的角度(或提及任何有关反向代理的内容)来看,它并没有多大意义。
**编辑:我还尝试使用以下方式将 HTTPS API 调用切换为常规 HTTP 调用:
curl http[colon][slash][slash]openlibrary[dot]org[slash]authors[slash]OL1A.json
(上面的 URL 已经过格式化以避免链接冲突问题)
但是,我的浏览器仍然出现同样的错误(如上所述)。
**Edit2:我试过运行你的代码,但我得到这个错误:
如果您查看图像,您将看到错误(在运行代码时):
builtins.AttributeError: 'str' object has no attribute 'decode'
最佳答案
如果您阅读 API documentation for ReverseProxyResource
,你会看到__init__
的签名是:
def __init__(self, host, port, path, reactor=reactor):
并且“host
”记录为“要代理的 Web 服务器的主机”。
因此,您正在传递 Twisted 需要主机的 URI。
更糟糕的是,ReverseProxyResource
是为在网络服务器上本地使用而设计的,完全不支持 https://
URLs的盒子。
它确实有一个(非常有限的)可扩展性 Hook - proxyClientFactoryClass
- 并且为 ReverseProxyResource
没有你需要的东西而道歉框,我将向您展示如何使用它来扩展 ReverseProxyResource
以添加 https://
支持,以便您可以使用 GitHub API :)。
from twisted.web import proxy, server
from twisted.logger import globalLogBeginner, textFileLogObserver
from twisted.protocols.tls import TLSMemoryBIOFactory
from twisted.internet import ssl, defer, task, endpoints
from sys import stdout
globalLogBeginner.beginLoggingTo([textFileLogObserver(stdout)])
class HTTPSReverseProxyResource(proxy.ReverseProxyResource, object):
def proxyClientFactoryClass(self, *args, **kwargs):
"""
Make all connections using HTTPS.
"""
return TLSMemoryBIOFactory(
ssl.optionsForClientTLS(self.host.decode("ascii")), True,
super(HTTPSReverseProxyResource, self)
.proxyClientFactoryClass(*args, **kwargs))
def getChild(self, path, request):
"""
Ensure that implementation of C{proxyClientFactoryClass} is honored
down the resource chain.
"""
child = super(HTTPSReverseProxyResource, self).getChild(path, request)
return HTTPSReverseProxyResource(child.host, child.port, child.path,
child.reactor)
@task.react
def main(reactor):
import sys
forever = defer.Deferred()
myProxy = HTTPSReverseProxyResource('api.github.com', 443,
b'/users/defunkt')
myProxy.putChild("", myProxy)
site = server.Site(myProxy)
endpoint = endpoints.serverFromString(
reactor,
dict(enumerate(sys.argv)).get(1, "tcp:8080:interface=127.0.0.1")
)
endpoint.listen(site)
return forever
如果你运行它,curl http://localhost:8080/
应该会如你所愿。
我冒昧地对您的 Twisted 代码进行了一些现代化改造; endpoints而不是 listenTCP
,logger而不是 twisted.python.log
,和 react
而不是自己启动 react 器。
末尾奇怪的小 putChild
部分是因为当我们将 b"/users/defunkt"
作为路径传递时,这意味着对 的请求/
将导致客户端请求 /users/defunkt/
(注意尾部斜杠),这是 GitHub 的 API 中的 404。如果我们明确代理空子段路径,就好像它没有尾随段一样,我相信它会达到您的预期。
请注意:从纯文本 HTTP 代理到加密 HTTPS 可能极其危险,所以我这里添加了一个默认的 localhost-only 监听接口(interface)。如果您的字节通过实际网络传输,您应该确保它们使用 TLS 正确加密。
关于Python 扭曲 : Reverse Proxy to HTTPS API: Could not connect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35664007/
如何在不使用Array.Reverse()方法的情况下反转数组(在C#中)?。例如,。应该会导致。这是我的面试任务。
我有一个内容,我希望它们以倒序排列和换行倒序排列,但顺序相反。这是代码: .a { height: 200px; width: 520px; padding: 5px 5px 5px 10
很多时候,我看到在列表头部运行的函数,例如: trimHead ('\n':xs) = xs trimHead xs = xs 然后我看到了定义: trimTail = reverse
如果 Reverse :: [k] -> [k]是一个类型族,那么 Haskell 无法判断 (Reverse (Reverse xs)) ~ xs .有没有办法让类型系统知道这一点而无需任何运行时成
我有一个单维项目数组,其声明和初始化为: string[] SubDirectorylist = Directory.GetDirectories(TargetDirectory); 我想反转成员并发
这是代码 >>> a=[1,3,2] >>> a [1, 3, 2] >>> a= 3,1,2 >>> a (3, 1, 2) >>> sorted(a) [1, 2, 3] >>> sorted(a
我对以下问题感兴趣:Collections.reverse() 与 Lists.reverse() 哪个更快? 最佳答案 他们做不同的事情。 Collections.reverse 采用可变列表并反转
我对以下问题感兴趣:Collections.reverse() 与 Lists.reverse() 哪个更快? 最佳答案 他们做不同的事情。 Collections.reverse 采用可变列表并反转
我今天在我的 Django 控制台中尝试了这个,我得到了两个不同的结果。我认为 list.reverse() 会反转列表(即第一个对象变成最后一个,依此类推)[1]。然而,情况似乎并非如此。 >>>
这个小小的 jQuery 插件: jQuery.fn.reverse = [].reverse; 它是如何工作的?对象绑定(bind)在哪里 - 反转函数的数组原型(prototype)?我真的不明白
大概都是 mylist.reverse()和 list.reverse(mylist)最终执行 reverse_slice 在 listobject.c通过 list_reverse_impl 或 P
您好,我在添加 django-reversion 和 django-reversion-compare 模块时遇到了一些问题。 我创建了新项目,我想使用 django-reversion 跟踪 use
我有以下观点: def default_new (request): if request.method == "POST": post = EquipmentForm(req
我对 List.Reverse() 有疑问和 Reverse(this IEnumerable source) .查看代码: // Part 1 List list = new List {
我需要首先对字典进行排序,值 reverse=True,对于重复值,按键排序 reverse=False 到目前为止,我有这个 dict = [('B', 3), ('A', 2), ('A', 1)
我有一个字典,其中包含要排序的字符串键和 int 值。我希望它首先按递减值编号排序,然后按字母顺序排序。 例如,如果您有一个包含以下内容的字典: my_dict = {'zebra':1, 'the'
我是编程新手。我正在通过第 9 channel 的 Bob Tabors 视频学习 c#。 你能解释一下为什么我们不能做这样的事情吗: string mijnVoornaam = "Remolino"
这个问题在这里已经有了答案: Why there is two completely different version of Reverse for List and IEnumerable? (
有什么区别 mylist = reversed(sorted(mylist)) 对 mylist = sorted(mylist, reverse=True) 为什么要使用一个而不是另一个? 如何在多
我的问题涉及将新方法添加到现有String 构造函数 的应用程序。在 Stoyan Stefanov 的 Object Oriented Program for Javascript 中,有一个使用
我是一名优秀的程序员,十分优秀!