在javascript中执行curl请求?
Posted
技术标签:
【中文标题】在javascript中执行curl请求?【英文标题】:Perform curl request in javascript? 【发布时间】:2014-10-20 09:01:21 【问题描述】:是否可以用 jQuery 或 javascript 发送 curl 请求?
类似这样的:
curl \
-H 'Authorization: Bearer 6Q************' \
'https://api.wit.ai/message?v=20140826&q='
所以,在 php 中提交一个表单,像这样:
$header = array('Authorization: Bearer 6Q************');
$ch = curl_init("https://api.wit.ai/message?q=".urlEncode($_GET['input']));
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch);
curl_close($ch);
我要做的是执行这个 curl 请求,它返回 json,然后我打算用 jQuery 的 $.get()
函数解析它。
【问题讨论】:
在 js 中你会使用 XMLHttpRequest 而不是 curl @JoeT 所以我可以使用 jQuery 的$.get
,我相信。但是如何将标头作为数组传递?
你可以看这里:***.com/questions/11312908/…
使用 XMLHttpRequest 可以使用 setRequestHeader 传递标头,但我不知道 w jQ 的 $.get
@JoeT 我收到 XMLHttpRequest 无法加载 api.wit.ai/message?v=20140826&q=。请求的资源上不存在“Access-Control-Allow-Origin”标头。我怎样才能传递那个标题?
【参考方案1】:
当前接受的答案是进行 ajax 调用,您可能需要处理跨站点问题。
但是,如果您只是想在服务器端运行 Linux curl,就像使用 PHP 一样,那么您可以使用它。
这是我使用 nodejs 执行 curl 请求的函数。
这是一个简单的异步函数,不需要 node 之外的特殊包。您可以对生成的数据和错误执行任何操作,也可以将其返回以在另一个异步函数中使用。
例如,我刚刚登录。
const util = require('util');
const exec = util.promisify(require('child_process').exec);
const goCurl = async (url) =>
const stdout, stderr = await exec(`curl '$url'`);
console.log('data:', stdout);
console.error('err:', stderr);
const url = `https://static.canva.com/web/a7a51d4eae8626ead168.ltr.css`;
goCurl(url);
【讨论】:
【参考方案2】:curl 是一个command in linux(和一个library in php)。 Curl 通常会发出 HTTP 请求。
您真正想做的是从 javascript 发出 HTTP(或 XHR)请求。
使用这个词汇,你会发现一堆例子,对于初学者来说: Sending authorization headers with jquery and ajax
基本上你会想要调用$.ajax
,并为标题等提供一些选项。
$.ajax(
url: 'https://api.wit.ai/message?v=20140826&q=',
beforeSend: function(xhr)
xhr.setRequestHeader("Authorization", "Bearer 6QXNMEMFHNY4FJ5ELNFMP5KRW52WFXN5")
, success: function(data)
alert(data);
//process the JSON data etc
)
【讨论】:
我收到了一个XMLHttpRequest cannot load https://api.wit.ai/message?v=20140826&q=. No 'Access-Control-Allow-Origin' header is present on the requested resource.
我怎样才能传递那个标头?
听起来像是跨域问题。那是浏览器安全问题。谷歌该错误和/或在一个新问题上对我提出问题,如果这不能解决它。
有人能解释一下 setRequestHeader 是如何设置的吗?我需要向 golang 发布 curl 请求
API 会将允许的来源附加到调用的响应标头中。您的域或 * 需要在那里。您尝试调用的 API 可能被配置为允许您的域,或者他们故意以这种方式强制执行服务器到服务器的使用,因为服务器端没有 CORS(它是一个浏览器实现)。查看 jsonp 以绕过此问题。【参考方案3】:
您可以使用 JavaScripts Fetch API(在您的浏览器中可用)发出网络请求。
如果使用节点,则需要安装node-fetch 包。
const url = "https://api.wit.ai/message?v=20140826&q=";
const options =
headers:
Authorization: "Bearer 6Q************"
;
fetch(url, options)
.then( res => res.json() )
.then( data => console.log(data) );
【讨论】:
fetch api 不适用于“http”请求。我在获取本地托管的 api 时遇到错误。 @AkashTyagi 如果不是 HTTP,那么您认为使用什么获取? 如果使用节点,请使用以下内容导入:const fetch = require('node-fetch')
。请注意,我需要在本地安装 node-fetch
才能使事情正常进行,并且不知道为什么全局安装的 node-fetch
不起作用。【参考方案4】:
是的,使用 getJSONP。这是进行跨域/服务器异步调用的唯一方法。 (*或将在不久的将来)。 像
$.getJSON('your-api-url/validate.php?'+$(this).serialize+'callback=?', function(data)
if(data)console.log(data);
);
回调参数会由浏览器自动填写,不用担心。
在服务器端('validate.php')你会有这样的东西
<?php
if(isset($_GET))
//if condition is met
echo $_GET['callback'] . '(' . "'message' : 'success', 'userID':'69', 'serial' : 'XYZ99UAUGDVD&orwhatever'". ')';
else echo json_encode(array('error'=>'failed'));
?>
【讨论】:
如果您可以控制服务器(并且回调包装器也需要它),那么使用 JSONP 几乎不是“进行跨域调用的唯一方法”。只需在服务器响应上添加 CORS 标头,它也可以在不使用 JSONP 的情况下正常工作。另外,使用普通的 GET 或 POST 允许您设置标头,而这在 getJSON 中是不可能的。 嗯,是的,但我最近发现它不太有效。在 Firefox 上有点错误,这对于移动浏览器来说效果不佳。但我会深入研究它!以上是关于在javascript中执行curl请求?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 instagram curl 发布请求转换为 javascript 请求?
在 JavaScript Fetch API 中实现 curl 发布请求