send request as jsonp, interpret response as text, using jQuery 1.5

三世轮回 提交于 2019-12-12 08:12:51

问题


Short question: is there a way to make a jsonp request to a server, capture the request, but not parse it as javascript? I am using dataType: "jsonp text" in jQuery 1.5 but it is not working.

I'm trying access a cross-domain URL via AJAX with jsonp. The problem is that the other domain (a directory listing at my university) is very old and I doubt the server supports jsonp.

  • In Firefox, I get a "XML tag name mismatch (expected META)" error. In chrome I get a "Uncaught SyntaxError Unexpected token <" both pointing to a file corresponding to my AJAX request . The error string from the error callback is "parsererror".
  • I can't do a normal AJAX call -- when I change datatype to just "text" or remove it all together, the other domain complains that the user is not authenticated and redirects to a login page -- even if I've already logged in browser side. When dataType is jsonp, this doesn't happen.
  • I know the server needs to support JSONP, and I don't think it does, but when I change dataType to JSONP, I can see the response page resources show up in both Chrome and Firefox -- so the server actually sends the response to the browser (a static HTML webpage + some java script) -- which contains the data I want to get at.
  • The problem is that jQuery is trying to parse the response as javascript, and fails (because it's not javascript). So the data ends up in the browser -- I just need to access it!
  • Using dataType: "jsonp text" which is supposed to indicate send a jsonp request and interpret the response as text makes no difference -- still a parse error.

What I want is: a way to access the response from a jsonp request as plain text. Or, if I can access the raw response from a failed jsonp request -- that would work too.

Thanks in advance!

Code:

ajax_url = 'https://somesite/?searchTerm='+query+'&searchType=lastname';
var jqxhr = $.ajax({type:"GET",
url: ajax_url,
dataType:"jsonp text",
callback: "whatever",
success:function(responseData) {
   $('div#content').text( responseData.slice(0, 100) );
   dbg(responseData.slice(0,100));
}})
.success(function() { alert("success"); })
.error(function(obj, errStr) { alert("error"); dbg("error: " + errStr + "test: " + test.responseText + this.responseTxt);})
.complete(function() { alert("complete"); });

回答1:


What you're trying to achieve won't work: jsonp can only be used if and when the server properly embed the response in a javascript function call.

Even though the server does send the file to the browser, you won't be able to access it because of security limitations: all you can do is execute said data as a script (with a script tag) or use it as a stylesheet (using a link tag) but you'll never, ever, be able to inspect the response in raw text if it's from another domain.

I suppose you tried to get the data as xml directly and that it failed (meaning the site does not support CORS). If you cannot change code server-side, then you only have two alternatives:

  1. Create a proxy on your own server that would tunnel the response (your server-side script makes the actual request and sends it to the browser): same-domain will then apply from the client's point of view and you'll be able to request data as XML,
  2. Use flash to bypass browser's security (you can use flXHR but it seems to be a little dated now).


来源:https://stackoverflow.com/questions/9239015/send-request-as-jsonp-interpret-response-as-text-using-jquery-1-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!