【问题标题】:Perform curl request in javascript?在javascript中执行curl请求?
【发布时间】: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,我相信。但是如何将标头作为数组传递?
  • 使用 XMLHttpRequest 可以使用 setRequestHeader 传递标头,但我不知道 w jQ 的 $.get
  • @JoeT 我收到 XMLHttpRequest 无法加载 api.wit.ai/message?v=20140826&q=。请求的资源上不存在“Access-Control-Allow-Origin”标头。我怎样才能传递那个标题?

标签: javascript jquery curl


【解决方案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 上有点错误,这对于移动浏览器来说效果不佳。但我会深入研究它!
    猜你喜欢
    • 2021-08-02
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2019-02-01
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多