如何在 4D v12 数据库中发出 HTTP 请求

How do I make a HTTP request in 4D v12 database

我的 4D 数据库有一个调用外部应用程序向 API 站点发出 HTTP 请求的方法,例如https://somewhere.com/api/?key=somekey&param=someparam。请求 returns 一个 JSON 响应。但是,外部应用只有returns个调用成功或失败。我无法提取 JSON 响应。

我的 4D 数据库仍然是版本 12,还没有迁移到最新版本的计划。我有什么办法可以发出 HTTP 请求并获得 JSON 响应吗?我正在考虑使用内置 PHP 引擎并进行 cURL 调用。有人用 4D 做过吗?

4D v12 内置了对 PHP 的支持。我使用 PHP EXECUTE 命令调用 PHP 文件。但是由于 4D v12 PHP 没有对我使用的 cURL 的原生支持 file_get_contents()

我的4D代码如下:

C_TEXT($result)
C_TEXT($param1)
C_BOOLEAN($isOk)
$param1:="Tiger"
//someFunction is a function in index.php. $result will hold the JSON return value. 
//I pass value "Tiger" as parameter
$isOk:=PHP Execute("C:\index.php";"someFunction";$result;$param1)

C:\index.php 包含 4D v12 将 运行 的 PHP 脚本。密码是

<?php
function someFunction($p1){
    $somekey = 'A$ga593^bna,al';
    $api_URL = 'https://somewhere.com/api/?key='. $somekey. '&param='.$p1;
    return file_get_contents($api_URL);
}
?>

此方法适用于 GET 请求。但这已经达到了我的目的。

我推荐使用 Keisuke Miyako 的 OAuth 插件。 https://github.com/miyako/4d-plugin-oauth。它带有一个 cURL 库和一个 JSON 解析库。我用它从 api 源中提取 JSON 数据。看起来他已经 depricated plug-in 但有指向单独组件的链接。

http://sources.4d.com/trac/4d_keisuke/wiki/Plugins/

ARRAY LONGINT($optionNames;0)
ARRAY TEXT($optionValues;0)
C_BLOB($inData;$outData)

$url:="https://api.atsomewhere.com/blahblah"
$error:=cURL ($url;$optionNames;$optionValues;$inData;$outData)

If ($error=0)
  $jsonText:=BLOB to text($outData;UTF8 text without length)

  $root:=JSON Parse text ($jsonText)

  JSON GET CHILD NODES ($root;$nodes;$types;$names)

  $node:=JSON Get child by name ($root;"Success";JSON_CASE_INSENSITIVE)
  $status:=JSON Get bool ($node)

  If ($status=1)
   $ResponseRoot:=JSON Get child by name ($root;"Response";JSON_CASE_INSENSITIVE)

   $node1:=JSON Get child by name ($ResponseRoot;"SourceId";JSON_CASE_INSENSITIVE)
   $node2:=JSON Get child by name ($ResponseRoot;"SourceName";JSON_CASE_INSENSITIVE)

   $output1:=JSON Get text ($node1)
   $output2:=JSON Get text ($node2)

End if 

如果

结束