gpt4 book ai didi

c# - ServiceStack 请求体

转载 作者:行者123 更新时间:2023-11-30 12:09:37 24 4
gpt4 key购买 nike

我正在尝试在 servicestack 和 ormlite 中编写我的第一个 REST 服务。不会太糟。

我已经设法编写了显示所有记录、基于 ID 的记录以及基于 ID 删除记录的代码。

现在我开始添加和编辑记录,但我对如何从调用的请求正文中获取数据感到困惑。

我在做一个

POST: http://localhost:7571/equipment/create/123

请求正文为

[{"eMCo":"1","equipment":"DP112","location":"Field","manufacturer":"","model":"","modelYr":"2013","vinNumber":"","description":"Trevor","status":"A","attachToEquip":"BR118","licensePlateNo":""}]

但在我的服务中,我不知道如何访问此函数中的请求正文数据:

public object Post(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
//base.Request.FormData[""]
db.Insert(request);
}
return null;
}

这是完整的代码...如果您能指出任何我做错的地方,请指出!

using ServiceStack;
using ServiceStack.OrmLite;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;

namespace ViewPoint
{
[Api("Enables viewiing, creation, updating and deletion of equipment from the EMEM table.")]
[Route("/equipment", "GET")]
[Route("/equipment/detail/{equipment}", "GET")]
[Route("/equipment/delete/{equipment}", "DELETE")]
[Route("/equipment/update/{equipment}", "PATCH")]
[Route("/equipment/create/{equipment}", "POST")]

public class EMEMTrev
{
public string eMCo { get; set; }
public string equipment { get; set; }
public string Location { get; set; }
public string Manufacturer { get; set; }
public string Model { get; set; }
public string ModelYr { get; set; }
public string VINNumber { get; set; }
public string Description { get; set; }
public string Status { get; set; }
public string AttachToEquip { get; set; }
public string LicensePlateNo { get; set; }
}

public class EMEMTrevResponse
{
public string eMCo { get; set; }
public string equipment { get; set; }
public string Location { get; set; }
public string Manufacturer { get; set; }
public string Model { get; set; }
public string ModelYr { get; set; }
public string VINNumber { get; set; }
public string Description { get; set; }
public string Status { get; set; }
public string AttachToEquip { get; set; }
public string LicensePlateNo { get; set; }
public ResponseStatus ResponseStatus { get; set; } //Where Exceptions get auto-serialized
}


public class EquipmentService : Service
{
public object Get(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
if (request.equipment == null)
{
List<EMEMTrev> results = db.Select<EMEMTrev>();
return results;
}
else
{
List<EMEMTrev> results = db.Select<EMEMTrev>(p => p.Where(ev => ev.equipment == request.equipment));
return results;
}

}
}
public object Delete(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
db.Delete<EMEMTrev>(p => p.Where(ev => ev.equipment == request.equipment));
}
return null;
}

public object Post(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
//base.Request.FormData[""]
db.Insert(request);
}
return null;
}

public object Patch(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
db.Update(request);
}
return null;
}
}
}

如有任何帮助,我们将不胜感激!

谢谢

更新代码:

服务设备.cs

using ServiceStack;
using ServiceStack.OrmLite;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Web;

namespace ViewPoint
{
[Api("Enables viewiing, creation, updating and deletion of equipment from the EMEM table. Use a POST to create an EMEM or a PUT to update one.")]
[Route("/equipment", "GET,POST,PUT")]
[Route("/equipment/{equipment}", "GET,DELETE")]

public class EMEMTrev
{
public string eMCo { get; set; }
public string equipment { get; set; }
public string location { get; set; }
public string manufacturer { get; set; }
public string model { get; set; }
public string modelYr { get; set; }
public string vinNumber { get; set; }
public string description { get; set; }
public string status { get; set; }
public string attachToEquip { get; set; }
public string licensePlateNo { get; set; }

}

public class EMEMTrevResponse
{
public EMEMTrev emem { get; set; }
public ResponseStatus ResponseStatus { get; set; } //Where Exceptions get auto-serialized
}


public class EquipmentService : Service
{
public object Get(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
if (request == null)
{
List<EMEMTrev> results = db.Select<EMEMTrev>();
return results;
}
else
{
List<EMEMTrev> results = db.Select<EMEMTrev>(p => p.Where(ev => ev.equipment == request.equipment));

return results;
}

}
}
public object Delete(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
db.Delete<EMEMTrev>(p => p.Where(ev => ev.equipment == request.equipment));
}
return new HttpResult
{
StatusCode = HttpStatusCode.NoContent,
Headers =
{
{HttpHeaders.Location, this.Request.AbsoluteUri.CombineWith(request.equipment)}
}
};
}

public object Post(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
db.Insert(request);
}
return new HttpResult()
{
StatusCode = HttpStatusCode.Created,
Headers =
{
{HttpHeaders.Location, base.Request.AbsoluteUri.CombineWith(request.equipment)}
}
};
}

public object Put(EMEMTrev request)
{
var dbFactory = new OrmLiteConnectionFactory("Data Source=(local);Initial Catalog=Kent;Integrated Security=True", SqlServerDialect.Provider);
using (IDbConnection db = dbFactory.OpenDbConnection())
{
db.Update(request);
}
return new HttpResult
{
StatusCode = HttpStatusCode.NoContent,
Headers =
{
{HttpHeaders.Location, base.Request.AbsoluteUri.CombineWith(request.equipment)}
}
};
}
}

AppHost.cs:

using System.Configuration;
using ServiceStack;
using ServiceStack.Auth;
using ServiceStack.Configuration;
using ServiceStack.Data;
using ServiceStack.OrmLite;

[assembly: WebActivator.PreApplicationStartMethod(typeof(ViewPoint.App_Start.AppHost), "Start")]


/**
* Entire ServiceStack Starter Template configured with a 'Hello' Web Service and a 'Todo' Rest Service.
*
* Auto-Generated Metadata API page at: /metadata
* See other complete web service examples at: https://github.com/ServiceStack/ServiceStack.Examples
*/

namespace ViewPoint.App_Start
{
public class AppHost : AppHostBase
{
public AppHost() //Tell ServiceStack the name and where to find your web services
: base("StarterTemplate ASP.NET Host", typeof(EquipmentService).Assembly) { }

public override void Configure(Funq.Container container)
{
//Set JSON web services to return idiomatic JSON camelCase properties
ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

//Configure User Defined REST Paths
//Routes
// .Add<Hello>("/hello")
// .Add<Hello>("/hello/{Name*}");

//Uncomment to change the default ServiceStack configuration
//SetConfig(new HostConfig {
//});

//Enable Authentication
//ConfigureAuth(container);

//Register all your dependencies
//container.Register(new TodoRepository());
}

/* Example ServiceStack Authentication and CustomUserSession */
private void ConfigureAuth(Funq.Container container)
{
var appSettings = new AppSettings();

//Default route: /auth/{provider}
Plugins.Add(new AuthFeature(() => new CustomUserSession(),
new IAuthProvider[] {
new CredentialsAuthProvider(appSettings),
new FacebookAuthProvider(appSettings),
new TwitterAuthProvider(appSettings),
new BasicAuthProvider(appSettings),
}));

//Default route: /register
Plugins.Add(new RegistrationFeature());

//Requires ConnectionString configured in Web.Config
var connectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(connectionString, SqlServerDialect.Provider));

container.Register<IUserAuthRepository>(c =>
new OrmLiteAuthRepository(c.Resolve<IDbConnectionFactory>()));

container.Resolve<IUserAuthRepository>().InitSchema();
}

public static void Start()
{
new AppHost().Init();
}
}

最佳答案

您的问题与 JSON 数据和 DTO 之间的大小写差异有关。映射区分大小写。 equipment 参数已填充,因为大小写匹配,但其余属性不匹配。

您可以通过将此行添加到您的 AppHost 配置来解决此问题。

JsConfig.EmitCamelCaseNames = true;

这会将序列化程序设置为将 JSON 数据中的 location 映射到 DTO 中的 Location 和其他属性,并处理转换序列化时返回。

因此您可以访问请求参数上的属性,而不是通过原始数据。


您的服务看起来不错。我无法立即看出它有任何问题,我认为问题可能出在您调用服务的方式上。

以下这些方法将有助于调试问题。我建议您尝试使用这个简单的 HTML 页面调用客户端,看看是否填充了必填字段。

创建一个文件,将其命名为 test.html 并将其放入包含您的 ServiceStack 服务程序集的 bin 文件夹中,然后导航至您的服务路径 http://localhost:7571/test.html.

<!doctype html>
<html>
<head>
<title>Test</title>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
function send()
{
// Send data to the service
$.ajax({
type: "POST",
url: "/equipment/create/DP112",
contentType: "application/json",
data: JSON.stringify({
eMCo: "1",
equipment: "DP112",
location: "Field",
manufacturer: "",
model: "",
modelYr: "2013",
vinNumber: "",
description: "Trevor",
status: "A",
attachToEquip: "BR118",
licensePlateNo: ""
})
}).done(function(result){

});
}
</script>
</head>
<body>
<button onclick="send()">Send Request</button>
</body>
</html>

此 html 文件应提供格式正确的请求。

还可以考虑添加请求记录器,方法是将此行添加到您的 AppHost 配置中。然后转到 http://localhost:7571/requeSTLogsSee here获取更多信息。

Plugins.Add(new RequestLogsFeature());

请求内容类型:

如果客户端请求中没有设置正确的内容类型,那么 ServiceStack 将不会将值填充到请求中。将请求的 contentType 设置为 application/json 有效。

关于c# - ServiceStack 请求体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21076824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com