我的服务器是Asp Net Web Api应用程序。它工作正常,但现在我尝试从PHP调用一些服务。
.Net代码是:
public void Post(int id, [FromBody] string param1)
在PHP方面,我使用:
$data = array("param1" => "value1");
$data_string = json_encode($data);
$ch = curl_init('http://localhost:53816/api/enterpriseapi/5');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
使用Debug,从PHP实际调用.Net服务,id分配给5,但POST“paramater1”参数始终为null,而不是“value1”。
我做错了什么?
答案 0 :(得分:2)
要检查的一些项目(不是PHP开发人员);
使用[FromBody]
- 请注意,POST正文格式应该 =foo
(而不是您期望的键值对 - 例如bar=foo
)
"When a parameter has [FromBody], Web API uses the Content-Type header to select a formatter. In this example, the content type is "application/json" and the request body is a raw JSON string (not a JSON object)."
REF:
... H个
答案 1 :(得分:1)
我不熟悉PHP,但我认为请求正文对于您显示的代码将是这样的。
{"param1" : "value1"}
如果这是正确的,你需要有你的动作方法和像这样的DTO类来绑定工作。
public void Post(int id, MyType myParam) { }
public class MyType
{
public string Param1 { get; set; }
}
现在,通过此,您可以看到Param1
参数的myParam
属性设置为value1
。
默认情况下,body会绑定到类似MyType
类的复杂类型。如果要绑定到简单类型,则不能使用键值对。由于正文完全绑定到一个参数,您将以某种方式需要在PHP中指定您的请求,以便只发送值而不使用密钥,就像这样。
"value1"