Json格式化从控制台应用程序到服务堆栈的数据

ami*_*tel 4 servicestack

我发现你是唯一一个回答服务堆栈的人,我没有收到电子邮件以及你提供给我的最后一个问题,看起来很好.

我见过你的个人资料,因为你是mythZ的主要创始人,我似乎再次问你我的问题.

对于我的一个问题,将JSON格式的POST数据发送到服务堆栈,我感谢您的回答.你的答案是正确的,但在我的情况下,我有以下案例.让我更详细地描述.

我见过服务堆栈的"Hello World"示例.我获得了https://github.com/ServiceStack/ServiceStack.Extras/blob/master/doc/UsageExamples/UsingRestAndJson.cs的链接

在我的情况下,我有控制台应用程序,它调用服务堆栈(在数据库中插入数据)现在,在该控制台应用程序中,我创建了一个类(class1),它在服务堆栈中具有相同的属性.

我在控制台应用程序中为该类的属性赋值,并将整个对象POST到服务堆栈.Syntex如下所示

 JsonServiceClient client = new JsonServiceClient(myURL);
       MYclass cls= MakeObjectForServiceStackToInsertData();
        var res = client.Post<MYClass>("/postrequest", cls); 
Run Code Online (Sandbox Code Playgroud)

我如上所述使用POST.这似乎没关系.在OnPOST事件的服务堆栈结束时,我获取此数据并插入数据库.它对我来说很好.

现在我的客户希望我们需要以任何格式传递数据.JSON/XML.我知道这是可能的,因为你提供了一个"Hello world"示例链接,它在那里提到.

但我发现,他们使用ajax/Jquery将数据发布到服务中.在我的情况下这是控制台应用程序,所以我无法使用ajax/Jquery.我想知道,是否有可能以JSON格式传递数据并在我的情况下进行操作.

非常感谢你提前.

myt*_*thz 6

所以,如果你想发布任何类型化和自由文本 JSONXML来ServiceStack那么你将无法ServiceStack的通用类型的C#的客户端(即其JsonServiceClient,XmlServiceClient等).相反,您只需要使用任何基本的Http客户端,例如.NET附带的HttpWebRequest.

正如我前面提到的发送自由文本JSON或XML是不正常的方式来调用ServiceStack Web服务(即它建议使用类型的DTO和通用服务客户端中的一个),但既然你已经在这里问是待机动单独,无依赖性的如何调用ServiceStack的Hello World示例Web服务的示例:

发送自由文本JSON

const string RemoteUrl = "http://www.servicestack.net/ServiceStack.Hello/servicestack/hello";

var httpReq = (HttpWebRequest)WebRequest.Create(RemoteUrl);
httpReq.Method = "POST";
httpReq.ContentType = httpReq.Accept = "application/json";

using (var stream = httpReq.GetRequestStream())
using (var sw = new StreamWriter(stream))
{
    sw.Write("{\"Name\":\"World!\"}");
}

using (var response = httpReq.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    Assert.That(reader.ReadToEnd(), Is.EqualTo("{\"Result\":\"Hello, World!\"}"));
}
Run Code Online (Sandbox Code Playgroud)

发送自由文本XML

var httpReq = (HttpWebRequest)WebRequest.Create(RemoteUrl);
httpReq.Method = "POST";
httpReq.ContentType = httpReq.Accept = "application/xml";

using (var stream = httpReq.GetRequestStream())
using (var sw = new StreamWriter(stream))
{
    sw.Write("<Hello xmlns=\"http://schemas.servicestack.net/types\"><Name>World!</Name></Hello>");
}

using (var response = httpReq.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    Assert.That(reader.ReadToEnd(), Is.EqualTo("<HelloResponse xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.servicestack.net/types\"><Result>Hello, World!</Result></HelloResponse>"));
}
Run Code Online (Sandbox Code Playgroud)

我已将上述示例添加到此Runnable Unit Test中.

我建议熟悉HTTP流量分析器工具,以便您可以轻松查看从Web服务发送和接收的HTTP流量.从那时起,能够锻炼如何打电话给您的服务变得微不足道.一些出色的HTTP流量分析器包括:

  • 提琴手
  • 浏览器中的网络检查员(例如Chrome,Safari,Firefox和IE都有很棒的工具)
  • Wireshark的

  • 所以我绝对建议在两端使用相同类型的DTO.类型化的API可以轻松编写代码,反复开发和重构.在大多数情况下,你只需要删除.dll就可以获得最新的更改,如果某些内容被破坏(即客户端依赖于已删除的字段),那么在编译时你就会知道它更好.至于序列化器,我推荐使用JSON,ServiceStack的JsonSerializer对DTO更改更快,更有弹性. (2认同)