Javascript:如何通过HTTPS和AJAX调用API?
以前我的网站是基于http协议的,所以在javascript中这样做很有效:Javascript:如何通过HTTPS和AJAX调用API?,javascript,python,ajax,ssl,tornado,Javascript,Python,Ajax,Ssl,Tornado,以前我的网站是基于http协议的,所以在javascript中这样做很有效: $.ajax({ url: 'http://x.x.x:5000/sthng', type: 'GET', headers: { "Authorization": "Basic " + btoa(uname + ":" + pass)
$.ajax({
url: 'http://x.x.x:5000/sthng',
type: 'GET',
headers: {
"Authorization": "Basic " + btoa(uname + ":" + pass)
},
success: function(result) {
console.log(result)
}
});
但由于http不安全,我转而使用HTTPS。当我试图访问HTTPS网站时,我应该如何进行ajax调用
顺便说一句,我使用的是位于FlaskAPI前面的Tornado web服务器。我的Tornado服务器代码如下:
from tornado.wsgi import WSGIContainer
from tornado.ioloop import IOLoop
from tornado.web import FallbackHandler, RequestHandler, Application
from flask-file import app
import tornado.httpserver
class MainHandler(RequestHandler):
def get(self):
self.write("This message comes from Tornado ^_^")
class getToken(tornado.web.RequestHandler):
def get(self):
self.write("hello")
tr = WSGIContainer(app)
application = Application([
(r'/', getToken),
(r"/tornado", MainHandler),
(r".*", FallbackHandler, dict(fallback=tr)),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application, ssl_options={
"certfile": "C:/x/key.pem",
"keyfile": "C:/x/server.key",
})
http_server.listen(5000)
tornado.ioloop.IOLoop.instance().start()
这就是每次Javascript(在AJAX中使用url:“”调用API时,我在Tornado中遇到的错误:
ERROR:tornado.application:Exception in callback (<socket.socket fd=344, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 5000)>, <function wrap.<locals>.null_wrapper at 0x000000000499FD90>) Traceback (most recent call last):
File "C:\Python34\lib\site-packages\tornado\ioloop.py", line 883, in
start handler_func(fd_obj, events)
File "C:\Python34\lib\site-packages\tornado\stack_context.py", line 275, in
null_wrapper return fn(*args, **kwargs)
File "C:\Python34\lib\site-packages\tornado\netutil.py", line 274, in
accept_handler callback(connection, address)
File "C:\Python34\lib\site-packages\tornado\tcpserver.py", line 239, in
_handle_connection do_handshake_on_connect=False)
File "C:\Python34\lib\site-packages\tornado\netutil.py", line 510, in
ssl_wrap_socket context = ssl_options_to_context(ssl_options)
File "C:\Python34\lib\site-packages\tornado\netutil.py", line 487, in
ssl_options_to_context context.load_cert_chain(ssl_options['certfile'],
ssl_options.get('keyfile', None)) ssl.SSLError: [SSL] PEM lib (_ssl.c:2515)
错误:tornado。应用程序:回调(,)回溯中出现异常(最近一次调用上次):
文件“C:\Python34\lib\site packages\tornado\ioloop.py”,第883行,在
启动处理程序\u func(fd\u对象,事件)
文件“C:\Python34\lib\site packages\tornado\stack\u context.py”,第275行,在
空包装返回fn(*args,**kwargs)
文件“C:\Python34\lib\site packages\tornado\netutil.py”,第274行,在
接受\u处理程序回调(连接、地址)
文件“C:\Python34\lib\site packages\tornado\tcpserver.py”,第239行,在
_handle\u connection do\u handshake\u on\u connect=False)
文件“C:\Python34\lib\site packages\tornado\netutil.py”,第510行,在
ssl\u包装\u套接字上下文=ssl\u选项\u到上下文(ssl\u选项)
文件“C:\Python34\lib\site packages\tornado\netutil.py”,第487行,在
ssl_选项到上下文上下文。加载证书链(ssl_选项['certfile'],
ssl_options.get('keyfile',None))ssl.SSLError:[ssl]PEM lib(_ssl.c:2515)
另外:做卷发给了我这个:
curl:(35)连接到x.x.x时出现未知SSL协议错误:5000
这里真的迷路了!请帮忙。谢谢。尝试将数据类型设置为“jsonp”,这对我处理跨源请求有帮助
$.ajax({
url: "https://x.x.x:5000/sthng/"
dataType: "jsonp",
success: function(data) {
console.log(data)
}
});
不需要类型:get as ajax调用默认为“get”尝试将数据类型设置为“jsonp”,这对跨源请求有帮助
$.ajax({
url: "https://x.x.x:5000/sthng/"
dataType: "jsonp",
success: function(data) {
console.log(data)
}
});
不需要类型:get as ajax调用默认为“get”您需要使用有效的certificate@JaromandaX该证书有效且经过验证。我不是亲自创建的。也许您需要使用有效的certificate@JaromandaX该证书有效且经过验证。不是我个人创造的,可能还是同一个问题。。我认为问题在于身份验证,而不是返回的内容。证书是否过期?否。它将在几年后过期。你确定证书有问题吗?我觉得这和我的ajax调用有关。如果你有访问权限,那么你可以尝试使用ngrok为它创建一个公共url并进行ajax调用。我确信您的ajax调用没有问题,ssl设置有问题。仍然是相同的问题。。我认为问题在于身份验证,而不是返回的内容。证书是否过期?否。它将在几年后过期。你确定证书有问题吗?我觉得这和我的ajax调用有关。如果你有访问权限,那么你可以尝试使用ngrok为它创建一个公共url并进行ajax调用。我确信您的ajax调用没有问题,ssl设置有问题。