使用带有PHP的Datasnap Server传递JSONObject作为参数

时间:2011-01-29 14:53:15

标签: php web-services delphi json datasnap

我有一个Datasnap Server,并且有一个名为:

的方法
function TServerMethodsMain.AddCity( ACity : TJSONObject ) : Boolean ;

我在下面做了一些小PHP代码来调用这个方法。

<?php

class city
{
   public $id;
   public $description;
   public $uf;          
}

$objcity = new city ;

$objcity -> id          = 1         ;
$objcity -> description = 'MY CITY' ;
$objcity -> uf          = 'XX'      ;

$url  = 'http://192.168.1.101:8088/datasnap/rest/TServerMethodsMain/AddCity/' ;
$url .= json_encode( $objcity ) ;

$page = file($url) ;  

$show = json_decode($page[0]);

echo '<pre>';

print_r ($show);

echo '</pre>';

?>

我从浏览器(Firefox或IE)收到此错误消息:

  

警告:   文件(http://192.168.1.101:8088/datasnap/rest/TServerMethodsMain/AddCity/ { “ID”:1, “描述”:“MY   CITY“,”uf“:”XX“})[function.file]:   无法打开流:HTTP请求   失败! HTTP / 1.1 500内部服务器   错误   C:\ xampp \ htdocs \ json-php \ index.php on   第19行

好吧,我有其他方法可以正常使用这个PHP代码,但只有当我传递为参数原始类型:字符串,整数......

我做了调试,看到问题发生,我需要将参数 JSONObject 转换为对象 unMarshalll )。当我通过Client Delphi Win32调用此方法时,它工作正常!

有人知道这个问题吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您的PHP代码向datasnap服务器发出GET请求。对于像JSONObject这样的复杂参数,您需要使用POST或PUT HTTP动词以及正确的JSONObject作为消息正文。 http://docwiki.embarcadero.com/RADStudio/en/DataSnap_REST_Messaging_Protocol#Parameters_in_the_URL

因此,您需要向datasnap服务器发送POST请求。查看文档以获取更多详细信息。 http://docwiki.embarcadero.com/RADStudio/en/DataSnap_REST_Messaging_Protocol

答案 1 :(得分:1)

PHP代码适用于 DataSnap - Delphi XE2

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/json", "Content-Type: text/xml; charset=utf-8"));
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'user:pass');
curl_setopt($ch, CURLOPT_URL, $param_url);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

答案 2 :(得分:0)