我需要帮助张贴一个文件(doc,Docx,或pdf)到一个ServiceStack API使用PHP。
php卷曲设置:
$curl = curl_init();
$cfile = new CURLFile('C:\\test.doc');
$params = array('Data' => $cfile);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS,$params);
API设置:
public object Any([FromBody]ExampleRequest exampleRequest){
...
}
public class ExampleRequest : IReturn<ExampleResponse>
{
public object Data { get; set; }
}
使用ExampleRequest内部名为object类型的Data的属性
我不确定为什么数据总是空的。 如有任何帮助,将不胜感激
[FromBody]
不是ServiceStack属性,在ServiceStack服务中无效。
您的类型化请求DTO只需与ExampleRequest
的模式匹配即可。 所有ServiceStack服务都可以通过QueryString,FormData或通过请求主体填充,这些内容类型都是默认注册的,比如JSON。 您需要确保请求发送的格式正确,与content-type
HTTP请求头匹配。
建议您永远不要使用object
,否则需要考虑反序列化object
类型的自定义序列化行为和安全限制。
通过定义Data
属性,您将告诉ServiceStack接受具有以下数据属性的请求(例如JSON):
{"Data": ...}
如果发送平面键/值对,请考虑使用dictionary
而不是object
您的请求DTO应该指定架构的类型,如果您不想这样做,您可以告诉ServiceStack跳过请求主体的反序列化,并通过让您的请求DTO实现IRequiresRequestStream来让您的服务解析原始请求主体,例如:
//Request DTO
public class ExampleRequest : IRequiresRequestStream
{
Stream RequestStream { get; set; }
}
实施:
public object Any(ExampleRequest request)
{
byte[] bytes = request.RequestStream.ReadFully();
string text = bytes.FromUtf8Bytes(); //if text was sent
}