编辑:好的,所以看起来像发布app / json需要处理服务器端而不是表单。有没有更好的方法将表单作为复杂对象在C#中发布?字符串:字符串只是没有剪切它。例如,我希望能够使用Dictionary来生成:
{
"data_map":{"some_value":1,"somevalue":"2"},
"also_array_stuffs":["oh look","people might", "want to", "use arrays"],
"integers_too":4
}
--- --- OP
我看过SO和其他地方。我只是尝试将JSON字符串POST到URL,但服务器端将内容解释为字符串而不是查询字典。我们还有其他不在c#中的服务器端(在HTML,JS,Objective-C,Java中),但由于某种原因,POST数据从C#客户端回来了。
C#来源:
private static Dictionary<string,object> PostRequest(string url, Dictionary<string, object> vals)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(BaseURL+url);
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = "POST";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = JsonFx.Json.JsonWriter.Serialize(vals);
//json = json.Substring(1,json.Length-1);
streamWriter.Write(json);
streamWriter.Close();
}
try
{
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
string response = streamReader.ReadToEnd();
Dictionary<string,object> retval = JsonFx.Json.JsonReader.Deserialize<Dictionary<string,object>>(response);
return retval;
}
}
catch(WebException e)
{
}
return null;
}
这被称为:
public static void Main (string[] args)
{
Dictionary<string,object> test = new Dictionary<string, object>();
test.Add("testing",3);
test.Add("testing2","4");
Dictionary<string,object> test2 = PostRequest("unitytest/",test);
Console.WriteLine (test2["testing"]);
}
无论出于何种原因,这是通过的请求对象:
<WSGIRequest
GET:<QueryDict: {}>,
POST:<QueryDict: {u'{"testing":3,"testing2":"4"}': [u'']}>,
COOKIES:{},
META:{'CELERY_LOADER': 'djcelery.loaders.DjangoLoader',
'CONTENT_LENGTH': '28',
'CONTENT_TYPE': 'application/json; charset=utf-8',
'DJANGO_SETTINGS_MODULE': 'settings.local',
'GATEWAY_INTERFACE': 'CGI/1.1',
'HISTTIMEFORMAT': '%F %T ',
'HTTP_CONNECTION': 'close',
'LANG': 'en_US.UTF-8',
'QUERY_STRING': '',
'REMOTE_ADDR': '127.0.0.1',
'REMOTE_HOST': '',
'REQUEST_METHOD': 'POST',
'RUN_MAIN': 'true',
'SCRIPT_NAME': u'',
'SERVER_PORT': '9090',
'SERVER_PROTOCOL': 'HTTP/1.0',
'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.7.2+',
'SHELL': '/bin/sh',
'SHLVL': '1',
'SSH_TTY': '/dev/pts/0',
'TERM': 'xterm',
'TZ': 'UTC',
'wsgi.errors': <open file '<stderr>', mode 'w' at 0x7f3c30158270>,
'wsgi.file_wrapper': <class 'django.core.servers.basehttp.FileWrapper'>,
'wsgi.input': <socket._fileobject object at 0x405b4d0>,
'wsgi.multiprocess': False,
'wsgi.multithread': True,
'wsgi.run_once': False,
'wsgi.url_scheme': 'http',
'wsgi.version': (1, 0)}>
[18/Oct/2012 19:30:07] "POST /api/1.0/unitytest/ HTTP/1.0" 200 31
请求中的一些更敏感的数据已被删除,但无关紧要
答案 0 :(得分:0)
因此,以这种方式发布Json与正常表单提交不同。这意味着如果您的服务器端期望只是正常的表单提交,它将无法正常工作。 C#代码按预期方式执行,但仅提交JSON字符串作为POST正文。虽然这对于验证,清理和处理原始输入的人来说可能很方便,但请记住,如果您使用的是普通的Web框架,则必须编写备用条件来接受原始字符串。
如果有人知道如何在C#中进行表单提交,其中包含比字符串的hashmap /字典更复杂的对象,那么我将提供你的答案并给你很多拥抱。现在,这个hacky废话必须要做。
答案 1 :(得分:0)
好吧,很久以前,我曾经实施过一个银行应用程序前端,它大量使用JSON进行客户端和服务器之间的通信。
这是一种从服务器查找复杂对象的简洁方法,无需进行复杂的清理或原始字符串处理。
关键是在服务器端使用为ajax设计的Web服务,您的Web服务器类应该如下所示:
[WebService(Namespace = "http://something.cool.com/")]
[ScriptService] // This is part of the magic
public class UserManagerService : WebService
{
[WebMethod]
[ScriptMethod] // This is too a part of the magic
public MyComplexObject MyMethod(MyComplexInput myParameter)
{
// Here you make your process, read, write, update the database, sms your boss, send a nuke, or whatever...
// Return something to your awaiting client
return new MyComplexObject();
}
}
现在,在您的客户端,设置一些东西以使ASP.NET在JSON中与您通信,我正在使用JQuery来发出ajax请求。
$.ajax({
type: 'POST',
url: "UserManagerService.asmx/MyMethod",
data: {
myParameter:{
prop1: 90,
prop2: "Hallo",
prop3: [1,2,3,4,5],
prop4: {
// Use the complexity you need.
}
}
},
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function(response) {
alert(response.d);
}
});
ASP希望作为ScriptMethod的结果返回的任何内容都将包含在response.d变量中。因此,假设您从服务器返回一个复杂对象,“response.d”是对象的引用,您可以像往常一样使用点表示法访问所有对象成员。