如何将JSONP数据转换为JSON数据

3
我正在使用一个返回JSON数据的API。不幸的是,因为CORS的限制,我无法将数据类型设置为JSON,只能使用API不支持的JSONP方式。
据我所知,可以通过给JSONP提供回调函数来将其转换为JSON格式。但是这种方法并没有奏效,而且我也在网上找不到解决方案。希望能得到帮助,让我能够将JSONP数据类型转换为JSON。
$(document).ready(function() {
  $.ajax({
    type:'POST',
    url:'http://api.smmry.com/&SM_API_KEY=XXXXXX&SM_URL=HTTP-URL',
    crossDomain: true,
    dataType: 'jsonp',
    jsonpCallback: 'jsonpFunc',
    jsonp:'callback'

  });

});

function jsonpFunc(data){
  console.log(data);
};

我遇到的错误

Uncaught SyntaxError: Unexpected token :

4
这个API返回JSON,但你需要使用JSONP来获取数据,所以你运气不太好。你需要从自己的服务器端代理获取内容,或者说服掌控这个API的人开始支持JSONP(或CORS头)。 - Pointy
JSONP基本上只是将远程<script>插入到当前文档中。服务器必须支持此功能。 - Felix Kling
我正在使用HTML、CSS、JS和smmry API来做一份兼职。我该如何正确地将脚本插入到文档中? - Fardaus
1
可能是使用JSONP从另一个服务器获取JSON数据的重复问题。 - Stephan Weinhold
此外,JSONP不支持POST方法,而且crossDomain对于JSONP请求也不是必需的。 - Stephan Weinhold
1个回答

0

最简单的方法是在您的服务器上使用服务器端代理。这种模型不会遇到CORS问题。

一个简单的C#代理示例可能是:

using System;
using System.Web.UI;
using System.Net;
using System.Configuration;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ProcessRequest(this.Page);
    }

    public void ProcessRequest(Page context)
    {
        WebClient client = new WebClient();
        string BaseUrl = ConfigurationManager.AppSettings["PassthroughTargetURL"];
        string _url = BaseUrl;
        context.Response.AddHeader("Content-type","application/json");
        string _out = client.DownloadString(_url);
        context.Response.Write(_out);
    }
}

使用以下调用ASPX页面;

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Passthrough-proxy.aspx.cs" Inherits="_Default" %>

还需要一个远程URL的配置项,如下所示:

<add key="PassthroughTargetURL" value="http://api.smmry.com/&SM_API_KEY=XXXXXX&SM_URL=HTTP-URL"/>

假设您调用的URL是恒定的,您应该得到预期的结果,但通过您的代理 - 它是本地服务器的代理,因此JSON将按预期工作。
然后,您的代码将变成类似以下内容:
$(document).ready(function() {
  $.ajax({
    type:'POST',
    url:'http://your.server/proxy.aspx',
    dataType: 'json'
  });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接