在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 发布请求

PHP Curl Timeout 导致 Javascript 客户端崩溃

AJAX 与 CURL

如何在php中获取curl请求的请求头信息及相应头信息

curl 库是不是在页面内执行 javascript?