1

我需要使用 PHP 将文件(doc、Docx 或 pdf)发布到 ServiceStack API 的帮助。

php cURL 设置:

$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 中有一个名为对象类型的数据的属性

我不确定为什么 Data 将始终为空。任何帮助,将不胜感激

4

1 回答 1

0

[FromBody]不是 ServiceStack 属性,在 ServiceStack 服务中没有影响。

您的 Typed Request DTO 需要简单地匹配ExampleRequest. 所有 ServiceStack 服务都可以由QueryString、FormData 或通过任何默认注册的 Content-Type(如 JSON)中的请求正文填充。您需要确保您的请求发送与其Content-TypeHTTP 请求标头匹配的正确格式。

建议您永远不要使用,object否则您需要考虑自定义序列化行为和反序列化类型的安全限制。object

通过定义一个Data属性,您是在告诉 ServiceStack 接受带有Data属性的请求(例如 JSON):

{"Data": ...}

如果发送平面键/值对,请考虑使用Dictionary<string,string>而不是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
}
于 2020-06-11T14:23:23.023 回答