提问者:小点点

Php将文件发布到ServiceStack API


我需要帮助张贴一个文件(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的属性

我不确定为什么数据总是空的。 如有任何帮助,将不胜感激


共1个答案

匿名用户

[FromBody]不是ServiceStack属性,在ServiceStack服务中无效。

您的类型化请求DTO只需与ExampleRequest的模式匹配即可。 所有ServiceStack服务都可以通过QueryString,FormData或通过请求主体填充,这些内容类型都是默认注册的,比如JSON。 您需要确保请求发送的格式正确,与content-typeHTTP请求头匹配。

建议您永远不要使用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
}