Jquery 使用POST请求从其他域获取JSON对象

Jquery 使用POST请求从其他域获取JSON对象,jquery,ajax,json,Jquery,Ajax,Json,我一直在想如何通过ajax将POST请求发送到另一个域的页面。似乎无论我走到哪里,都有人告诉我,当POST请求跨域时,不能简单地使用POST请求 我试图通过POST请求从美国地质调查局网站获取土壤信息。以下是解释流程的页面: 以下是我的jQuery: var postObj = { json: 'true', site_name: 'model', top_left_lat: 0, top_left_lon: 0, bottom_right_lat: 1,

我一直在想如何通过ajax将POST请求发送到另一个域的页面。似乎无论我走到哪里,都有人告诉我,当POST请求跨域时,不能简单地使用POST请求

我试图通过POST请求从美国地质调查局网站获取土壤信息。以下是解释流程的页面: 以下是我的jQuery:

var postObj = {
    json: 'true',
    site_name: 'model',
    top_left_lat: 0,
    top_left_lon: 0,
    bottom_right_lat: 1,
    bottom_right_lon: 1,
    slope_type: 'stable',
    output_types: ['jpg', 'xyz', 'grd']
}

$.ajax({
    url: "http://earthquake.usgs.gov/hazards/apps/vs30/vs30.php",
    type: 'POST',
    dataType: 'jsonp',
    data: postObj,
    success: function(data) {
        console.log(data);
    }
});
这是我执行后的控制台:

Resource interpreted as Script but transferred with MIME type text/html: "http://earthquake.usgs.gov/hazards/apps/vs30/vs30.php?callback=jQuery111007…es%5B%5D=jpg&output_types%5B%5D=xyz&output_types%5B%5D=grd&_=1402961661663 ". jquery-1.11.0.min.js:4
Uncaught SyntaxError: Unexpected token < vs30.php:1
资源解释为脚本,但使用MIME类型text/html传输:http://earthquake.usgs.gov/hazards/apps/vs30/vs30.php?callback=jQuery111007…es%5B%5D=jpg和输出类型%5B%5D=xyz和输出类型%5B%5D=grd和类型=1402961661663”。jquery-1.11.0.min.js:4
未捕获的语法错误:意外标记

知道我做错了什么吗?美国地质勘探局网站忘记了“访问控制允许原点:”?请帮忙

JSONP不支持POST请求,因此您的请求将转换为GET请求,并将来自postObj的信息附加到查询字符串中。这就是API响应错误消息的原因(显然格式为HTML)

此外,不包含任何关于JSONP的信息。我认为它们只支持普通的JSON,而不支持JSONP

由于同源策略,可能无法使用现代浏览器访问此JSON。正如你在问题中所写,这不是你的错——美国地质调查局根本不发送CORS头文件。如果您试图使用不执行SOP的工具发送POST请求,那么它会起作用。例如,以下wget请求成功:

wget --post-data "json=true&site_name=model&top_left_lat=0&top_left_lon=0&bottom_right_lat=0.1&bottom_right_lon=0.1&slope_type=stable&output_types%5B%5D=jpg&output_types%5B%5D=xyz&output_types%5B%5D=grd" http://earthquake.usgs.gov/hazards/apps/vs30/vs30.php
要么他们“忘记”了CORS头(正如您所写的),要么这个API不是为来自web浏览器的请求而设计的,只针对服务器端应用程序等

一种解决方案是在您自己的服务器上安装一个代理,将请求转发到USGS服务器。如果您的服务器支持mod_proxy,请在目录的.htaccess文件中使用:

ProxyPass / http://earthquake.usgs.gov/hazards/apps/vs30/vs30.php
并将jQuery AJAX请求发送到此目录

如果您不能使用.htaccess,您的服务器不支持mod_proxy等。您可以使用一个简单的PHP脚本来编写您自己的“proxy”:


实际响应是什么?似乎正在返回一个页面。另外,jsonp击败了cors。@DanielA.White这是完整的URL:。。。这会将我带到一个包含我想要的三个项目的页面,但它们是空白文件,尝试下载它们会导致错误。chrome控制台中的实际响应只是该页面的源代码。将“jsonp”更改为“json”将返回XMLHTTPREQUEST错误:XMLHTTPREQUEST无法加载。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。
<?php
header('Content-Type: application/json');
$req = new HttpRequest('http://earthquake.usgs.gov/hazards/apps/vs30/vs30.php', HttpRequest::METH_POST);
$req->addPostFields($_POST);
echo $req->send()->getBody();