[英]Javascript: How to call an API over HTTPS and AJAX?
以前我的網站使用的是http協議,因此在我的JavaScript中可以正常運行:
$.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調用?
順便說一句,我正在使用Flask API前面的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:' https:// xxx:5000 / sthng ')調用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)
另外:執行curl給我這樣的事情:curl:(35)連接到xxx:5000的未知SSL協議錯誤
真的在這里迷路了! 請幫忙。 謝謝。
嘗試將數據類型設置為“ jsonp”,這對跨域請求很有幫助。
$.ajax({
url: "https://x.x.x:5000/sthng/"
dataType: "jsonp",
success: function(data) {
console.log(data)
}
});
不需要類型:ajax調用的get默認為'get'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.