如何在4D v12数据库

时间:2016-07-30 05:31:53

标签: 4d-database

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

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

2 个答案:

答案 0 :(得分:2)

我建议使用Keisuke Miyako的OAuth插件。 https://github.com/miyako/4d-plugin-oauth。它带有一个cURL库和一个JSON解析库。我用它来从api源中提取JSON数据。看起来他已经删除了插件,但链接到了单独的组件。

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 

如果

结束

答案 1 :(得分:0)

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请求。但这已经成为我的目的。