1

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

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

4

2 回答 2

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 

万一

于 2017-02-14T22:57:09.250 回答
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 请求。但这已经达到了我的目的。

于 2016-07-30T13:29:55.840 回答