在JSONP请求中设置响应内容类型标头?

时间:2015-05-08 06:55:14

标签: javascript jquery ajax utf-8 jsonp

我有一个用例,我在其中制作跨域JSONP请求。

$.ajax({
  url: "http://anyorigin.com/get/?url=<any_website_url>&callback=?'",
  dataType: 'jsonp',
  success: function(data) {
    console.log(data);
}});

它工作正常,但我注意到中国网站的数据出现乱码。我对此进行了调试,发现response-header始终设置为:

Response Header: Content-Type:text/javascript; charset=ISO-8859-1

现在这个charset ISO-8859-1正在创建一个问题。应该是UTF-8。我基本上想要总是将这个charset覆盖为UTF-8。我知道我可以使用ajax来做到这一点。我尝试使用以下代码 -

$.ajax({
  url: "http://anyorigin.com/get/?url=www.google.com&callback=?'",
  dataType: 'jsonp',
  beforeSend: function(xhr) {
    console.log(xhr);
    xhr.overrideMimeType("text/javascript; charset=utf-8");
  },
  success: function(data) {
    console.log(data);
}});

但这并没有解决问题。我猜测由于JSONP请求不使用XHR对象,这将无法正常工作。

有谁能告诉我如何实现这一目标或者是否可以实现? TIA。

1 个答案:

答案 0 :(得分:3)

jsonp请求本质上是使用<script>标记包含的外部JavaScript文件。幸运的是,<script> - 元素具有charset属性,您可以设置UTF-8。这看起来像

<script 
  src="http://anyorigin.com/get/?url=<any_website_url>&callback=myCallbackFunction"
  charset="UTF-8"
></script>

其中先前已定义myCallbackFunction,并将使用请求的数据进行调用。所以你得到的是

<script>
  window.myCallbackFunction = function(data){
  }
  // Dynamically insert the previously describe <script> tag here.
</script>

事实证明,通过设置jQuery.ajax属性,scriptCharset函数opts也可以直接执行此操作。

  

仅适用于&#34;脚本&#34;使用传输(例如,使用&#34; jsonp&#34;或&#34;脚本&#34; dataType和&#34; GET&#34;类型)的跨域请求。设置请求中使用的脚本标记的charset属性。当本地页面上的字符集与远程脚本上的字符集不同时使用。