Strange JQuery Error “code 501, message Unsupporte

2019-01-15 08:16发布

问题:

I am learning the JQuery Get method. I start up a Python HTTP server:

(just typing command "Python -m SimpleHTTPServer").

It's fine to test this webserver by just visiting "http://localhost:80" on my web browser. However, when I write this very simple javascript to visit my webserver. I get an error message:

"code 501, message Unsupported method ('OPTIONS')"

I use jquery.xdomainajax.js library which suppose cross domain request JQuery.

Here is my javascript code:

<html>
<head>
<script src="jquery.min.js"></script>
<script src="jquery.xdomainajax.js"></script>
<script type="text/javascript">
$(document).ready(function(){ 
  u = 'http://localhost:80';
 jQuery.get(u, function(res){       
    $("#data").html(res.responseText)
});
});


</script>
</head>
<body>
<p id="data"></p>
</body>
</html>

Actually, if I change u to any other url, such as "http://www.google.ca". It works quite well. But I have no idea why it does not work for the basic Python HTTP server. Can anyone help me?

回答1:

What I do is to write a customized HTTPRequestHandler. I add a do-OPTIONS method inside MyHandler to tell browser my server support CORS. This is done by sending headers Access-Control-Allow-Origin, Access-Control-Allow-Methods and Access-Control-Allow-Headers. Also, I add a "self.send_header('Access-Control-Allow-Origin', '*')" statement in do_GET method.

class MyHandler(BaseHTTPRequestHandler):
    def do_OPTIONS(self):           
        self.send_response(200, "ok")       
        self.send_header('Access-Control-Allow-Origin', '*')                
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With")        

    def do_GET(self):           
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Content-type',    'text/html')                                    
        self.end_headers()              
        self.wfile.write("<html><body>Hello world!</body></html>")
        self.connection.shutdown(1) 


回答2:

You may also need to add fields such as "Content-Type" to the allowed headers.

self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type") 


回答3:

Looks like a CORS preflight request (https://developer.mozilla.org/En/HTTP_access_control)

I guess you are trying to access to a different domain/port. Depending on the request, the browser will send a preflight request (an OPTION request) to know if the server accepts the set of Headers or HTTP method you wanted to send in the first place. If the server responds OK, the browser will send the real request.

Looks like that Python server doesn't implement OPTIONs requests, hence the error.

Tip: Network inspection tools (tcpdump, wireshark, ngrep...) help a lot when dealing with http requests and/or network errors.



回答4:

It look like a Cross-Origin Resource Sharing (CORS) preflight request.

Since CORS is a specification that is strongly related to a server configuration, I recommend to read http://enable-cors.org/

There you'll see more about implementing CORS for your specific platform.