我正在尝试使用 Jquery 和 PHP/Symfony(HttpFoundation 组件)进行一些跨站点脚本编写,但我无法让服务器返回必要的数据。
我的目标是让 JQuery 从本地域检索 JSON:PHP 访问服务器端的外部 API。我已经打开 Access-Control-Allow-Origin header 到 * 以允许 CORS 正常,并且直接使用虚拟数据一切正常。但是,通过 JQuery 使用 JSON 端点失败。一切都发生在同一个域上。
因此,如果我手动创建一个 JSON 响应,这个虚拟 JSON 数据可以很好地呈现:
$data = json_decode('{
"foo": "bar",
"items": [
{
"id": "1234",
"foo": "bar",
"baz": "bingo",
},
{
"id": "4567",
"foo": "blork",
"baz": "fladdurk",
}
}', true);
$response = JsonResponse::create($data, 200);
$response->headers->set('Access-Control-Allow-Origin', '*');
$response->send();
JSON 在我的客户端中显示很好,位于 http://localhost/json_endpoint?q=stuff。我得到一个很好的 JSON 字符串:
{"foo":"bar","items":[{"id":"1234","foo":"bar","baz":"bingo"},{"id":"4567","foo":"blork","baz":"fladdurk"}]}
在前端使用 JQuery 也能很好地工作。虚拟数据看起来完全一样,我可以使用它;当 JSON 不是来自外部 API 时,大概 Symfony 不介意提供它。
如果我尝试向外部 API(这是数据应该来自的地方)发出 PHP 请求,事情就会开始变得奇怪:
protected function url_tools__request($url, $timeout=10, $headers=array()) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //suppress output.
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$ch_exec = curl_exec($ch);
curl_close($ch);
return $ch_exec;
}
$url = "http://api.example.com/?q=more+stuff";
$headers = array("Accept:application/json");
$xsr = $this->url_tools__request($url, 10, $headers);
$data = [
"foo" => "bar",
// here's the rub
"items" => json_decode($xsr, true),
];
$response = JsonResponse::create($data, 200);
$response->headers->set('Access-Control-Allow-Origin', '*');
$response->send();
有了这个实时数据,如果直接在 http://localhost/json_endpoint?q=stuff 访问,所有内容都会正确显示在客户端中。所以 API 工作正常。我得到与上面完全相同的完整 JSON 字符串:
{"foo":"bar","items":[{"id":"1234","foo":"bar","baz":"bingo"},{"id":"4567","foo":"blork","baz":"fladdurk"}]}
但是如果我尝试通过 JQuery AJAX(可能在 http://localhost/another_page.html)访问这个端点,我会得到一个没有任何“项目”的 JSON 字符串:
{"foo":"bar","items":[]}
我的 JQuery 代码如下所示:
xhr = $.ajax({
url: '/json_endpoint',
data: {q: "more+stuff"},
type: "GET",
dataType : "json"
})
.done(function(data, textStatus, request) {
console.log(data)
}
我从各个角度查看了我的请求和响应,无论使用虚拟数据还是实际 (XSS) 数据,PHP/Symfony 解析的字符串都是相同的。我很确定没有竞争条件或任何东西。
知道我做错了什么吗?提前致谢。
最佳答案
原来 CORS 的东西完全是转移注意力的东西。
JQuery 使用百分号对 URL 进行编码,而我的 PHP 没有考虑到这一点。我将失败的调用解释为 CORS 有问题;事实并非如此。
所以这个 url 实际上可以工作:
$url = "http://api.example.com/?q=stuff";
问题在于更复杂的 URL,包含空格和标点符号。这在直接访问时可以正常工作:
$url = "http://api.example.com/?q=more+stuff";
但是在使用JQuery的时候,决定将查询字符串变成:
more%sBstuff
...这让 PHP 感到困惑。在我的代码中更高,在我有这个之前:
$url = urlencode($request->get('q'));
现在我必须添加另一个 urldecode
$query = urlencode(urldecode($request->get('q')));
抱歉造成混淆。我希望这有朝一日能对互联网领域的某个人有所帮助。
关于从同一域上的另一个页面调用时,PHP 外部 API 访问失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40557161/
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案