【问题标题】:https connection passing another serverhttps 连接通过另一台服务器
【发布时间】:2014-07-27 22:57:35
【问题描述】:

我想做以下场景,但我真的不知道这是否可能或我需要使用什么技术:

所以我使用外部 api 来存储我的 Web 应用程序的信息。现在我想将api请求发送到我的服务器,它可能通过使用curl将它发送到api服务器并等待响应..当我收到响应时,我在我的服务器上更新一些东西,比如在mysql中插入行并将响应发回给请求者

现在 api url 正在使用 https,而我的服务器当前正在使用 http.. 这会是一个测试问题还是我也需要 https?

我应该如何使用 php 来实现它?也许某种重定向?还是我必须重建整个请求?

提前致谢

【问题讨论】:

  • 你调用的外部服务是什么?它生成什么格式:XML、JSON 还是其他?您使用什么框架来开发这个网站?它将部署在哪里:Linux、Windows 还是其他?您是在开发这个还是有开发者在为您开发?
  • 嗯,它是一个返回 json 的私有 api,我使用的是 slim php 框架,它将托管在 linux 上,但我不明白为什么它很重要 :)
  • @nate 我添加了更多信息,你能相应地更新你的问题吗?

标签: php api redirect curl https


【解决方案1】:

nate 说的大致正确,但是如果你想使用 cURL 从 HTTP 发布到 HTTPS,也要设置这个选项:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

这会阻止 cURL 验证对等方的证书(我猜你不关心在第二个服务器和 API 之间使用 SSL)。

应用服务器上的代码:

$data = http_build_query(
    // Your parameters go here
);
file_get_contents('http://middleserverurl.com/?' . $data);

中间服务器上的代码:

$apiurl = "https://apiurl.com/?" . http_build_query($_GET);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);

// Decode the result data here

// Insert into your database here

// Send something back to your app server e.g.:

$data = http_build_query(
    // What you want to send back form the result
);
file_get_contents('http://appserverurl.com/?' . $data);

【讨论】:

    【解决方案2】:

    您的问题有很多未知数,很难回答,但这里是。

    您当然不必通过 HTTPS 提供自己的应用程序,您可以查询 HTTPS API,然后通过 HTTP 提供自己的响应。我应该警告您,这样做会使外部服务不那么安全。如果您充当外部服务的代理,我建议您获取 SSL 证书并以正确的方式进行操作。

    由于您的问题缺乏细节,因此很难回答具体问题,但这里有一个小代码块可以帮助您入门:

    <?php
    
    $url = "https://service/endpoint";
    $params = array(
        'api_token' => 'mytoken',
        'param1' => 'myparam',
    );
    $url .= http_build_query($params);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $result = curl_exec($ch);
    if (curl_errno($ch)) {
        echo 'received error: ' . curl_error($ch) . ' (code: ' . curl_errno($ch);
    } else {
        echo 'received response: ' . $result;
    }
    

    【讨论】:

    • 谢谢..所以我基本上你说我需要用 curl 重建 te 请求?难道没有别的办法吗?你能说一下缺少哪些细节吗?另外,正如您所说,我只需要一个 ssl 证书来保证它的安全吗?但我认为您的代码不适用于 https 连接。你能提供更多关于我需要的 https curl 命令的信息吗?
    • 查看我对原始问题的评论,了解有助于回答您问题的其他详细信息。注意 $url 变量中的 https://,它确保我提供的代码通过 HTTPS 连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2010-10-05
    相关资源
    最近更新 更多