CURL 到 WCF 的更好方法
Better way to CURL to WCF
我可以通过 CURL 请求 post 到我用 C# 从 PHP 编写的 web-service,但我无法让请求正确通过。无论我做什么,让 post 显示的唯一方法是 json_encode
表单数据 headers。所以我的 PHP 代码最终是这样的:
$user = array('id'=>5, 'first_name' => 'First', 'last_name' => 'Last');
$uch = curl_init();
curl_setopt($uch, CURLOPT_URL,"http://localhost:50115/Service1.svc/postUser");
curl_setopt($uch, CURLOPT_POST, 1);
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode("user=" . json_encode($user)));
curl_setopt($uch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json'
));
curl_setopt($uch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($uch);
当我设置线时:
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode("user=" . json_encode($user)));
至:
curl_setopt($uch, CURLOPT_POSTFIELDS, array("user" => json_encode($user)));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS,
http_build_query(array("user" => json_encode($user))));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode($user));
PHP 中没有错误,C# 服务没有 return 错误(我确实在配置中设置了 return 异常设置),并且break-point 函数永远不会被命中。
在 C# 方面,我的界面和服务设置如下:
//Interface
[OperationContract]
[WebInvoke(Method="POST",
BodyStyle=WebMessageBodyStyle.Bare, //Any other value, the break-point
//will not trigger
RequestFormat=WebMessageFormat.Json,
UriTemplate = "postUser")]
void PostUser(string user);
//Service
public void PostUser(string user)
{
var request = user;
int i = 5; //Debug set here
}
当 break-point 命中时,我可以看到 user
的值为:
user={"id":5,"first_name":"First","last_name":"Last"}
我想要的是 user
的值只是:
{"id":5,"first_name":"First","last_name":"Last"}
是否可以收到我这样的回复?如果是这样,我需要更改什么才能完成它?
在 PHP 和 C# 中尝试了多种组合后,我终于让它工作了。在 PHP 中,CURLOPT_POSTFIELDS
需要设置为:
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode(array("user" => json_encode($user))));
然后,在 C# 中,我需要将 BodyStyle=WebMessageBodyStyle.Bare
更改为 BodyStyle=WebMessageBodyStyle.Wrapped
;
我可以通过 CURL 请求 post 到我用 C# 从 PHP 编写的 web-service,但我无法让请求正确通过。无论我做什么,让 post 显示的唯一方法是 json_encode
表单数据 headers。所以我的 PHP 代码最终是这样的:
$user = array('id'=>5, 'first_name' => 'First', 'last_name' => 'Last'); $uch = curl_init(); curl_setopt($uch, CURLOPT_URL,"http://localhost:50115/Service1.svc/postUser"); curl_setopt($uch, CURLOPT_POST, 1); curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode("user=" . json_encode($user))); curl_setopt($uch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json' )); curl_setopt($uch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($uch);
当我设置线时:
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode("user=" . json_encode($user)));
至:
curl_setopt($uch, CURLOPT_POSTFIELDS, array("user" => json_encode($user)));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS,
http_build_query(array("user" => json_encode($user))));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode($user));
PHP 中没有错误,C# 服务没有 return 错误(我确实在配置中设置了 return 异常设置),并且break-point 函数永远不会被命中。
在 C# 方面,我的界面和服务设置如下:
//Interface [OperationContract] [WebInvoke(Method="POST", BodyStyle=WebMessageBodyStyle.Bare, //Any other value, the break-point //will not trigger RequestFormat=WebMessageFormat.Json, UriTemplate = "postUser")] void PostUser(string user); //Service public void PostUser(string user) { var request = user; int i = 5; //Debug set here }
当 break-point 命中时,我可以看到 user
的值为:
user={"id":5,"first_name":"First","last_name":"Last"}
我想要的是 user
的值只是:
{"id":5,"first_name":"First","last_name":"Last"}
是否可以收到我这样的回复?如果是这样,我需要更改什么才能完成它?
在 PHP 和 C# 中尝试了多种组合后,我终于让它工作了。在 PHP 中,CURLOPT_POSTFIELDS
需要设置为:
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode(array("user" => json_encode($user))));
然后,在 C# 中,我需要将 BodyStyle=WebMessageBodyStyle.Bare
更改为 BodyStyle=WebMessageBodyStyle.Wrapped
;