有一段时间我的所有ServiceStack服务都使用POST
动词来处理客户端发送的传入请求。在这个特定的场景中,我想使用GET
动词,我希望能够传递一个相当复杂的对象(例如,包含数组。)
这是我的ServiceStack代码:
[Route("Test")]
public class TestRequest : IReturn<TestResponse>
{
public Criteria Criteria { get; set; }
}
public class Criteria
{
public string Msg { get; set; }
public string[] Keys { get; set; }
}
[DataContract]
public class TestResponse
{
[DataMember]
public string Text { get; set; }
[DataMember]
public ResponseStatus ResponseStatus { get; set; }
}
public class TestService : ServiceInterface.Service, IGet<TestRequest>, IPost<TestRequest>
{
public object Get(TestRequest request)
{
return HandleRequest(request);
}
public object Post(TestRequest request)
{
return HandleRequest(request);
}
private object HandleRequest(TestRequest request)
{
if (request == null) throw new ArgumentNullException("request");
if (request.Criteria == null)
throw new ArgumentException("Criteria is null.");
return new TestResponse
{
Text =
String.Format(
"Text: {0}. Keys: {1}",
request.Criteria.Msg,
String.Join(", ", request.Criteria.Keys ?? new string[0]))
};
}
}
HTML应用程序使用以下jQuery代码消耗的内容:
$(document).ready(function () {
$.when($.ajax({
url: '/Test',
type: 'get',
dataType: 'json',
contentType: 'application/json',
data: {
"criteria": JSON.stringify({
"msg": "some message",
"keys": ["key1", "key2"]
})
}
}).done(function (response) {
console.log(response);
}).fail(function (response) {
console.log(response);
}));
});
我的Criteria对象已创建,但Msg
和Keys
属性为空。
使用以下POST
示例,应用程序按预期工作:
$(document).ready(function () {
$.when($.ajax({
url: '/Test',
type: 'post',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({
"criteria": {
"msg": "some message",
"keys": ["key1", "key2"]
}
})
}).done(function (response) {
console.log(response);
}).fail(function (response) {
console.log(response);
}));
});
我误解了什么?
答案 0 :(得分:1)
注意:您不能将JSON字符串与JSON对象混合使用(即在POCO中键入C#)。
您正在尝试发送序列化的JSON字符串,该字符串在JSON字符串中进行转义,例如:
"{\"msg\":..."
将线路连接到期望JSON对象的POCO,例如:
{"msg":...
如果条件是字符串,例如:
public class TestRequest : IReturn<TestResponse>
{
public string Criteria { get; set; }
}
它应该可以工作,否则你需要更改你的JSON请求来发送一个JSON对象而不是一个序列化+转义为JSON字符串的JSON对象。
答案 1 :(得分:0)
当您对GET请求使用JSON.stringify时,查询字符串格式不正确...