1

編集:わかりました。アプリケーション/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 文字列を URL に POST しようとしていますが、サーバー側はコンテンツをクエリ dict ではなく文字列として解釈し続けます。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

リクエスト内のより機密性の高いデータの一部は削除されましたが、無関係です

4

2 に答える 2

0

うーん、自分の質問に答える習慣をつけないようにしたいと思います。

したがって、この方法でJsonを投稿することは、通常のフォーム送信とは異なります。つまり、サーバー側が通常のフォーム送信だけを期待している場合、それは機能しません。C#コードは意図したとおりに機能しますが、POST本文としてJSON文字列のみを送信します。これは、生の入力を検証、クリーンアップ、および処理する人にとっては便利かもしれませんが、通常のWebフレームワークを使用している場合は、生の文字列を受け入れるための代替条件を作成する必要があることに注意してください。

文字列のハッシュマップ/辞書よりも複雑なオブジェクトを含むC#でフォームを送信する方法を誰かが知っている場合は、私はあなたの答えに賛成し、たくさんの抱擁を与えます。今のところ、このハッキーなナンセンスはやらなければならないでしょう。

于 2012-10-20T02:34:32.763 に答える
0

昔、私はバンキング アプリのフロント エンドを実装しました。このフロント エンドでは、クライアントとサーバー間の通信に JSON を大量に使用していました。

サーバーとの間で複雑なオブジェクトを見つけるためのクリーンな方法であり、複雑なクリーンアップや生の文字列処理を行う必要はありません。

重要なのは、サーバー側で ajax 用に設計された WebServices を使用することでした。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 で対話するように設定します。ajax 要求を作成するために JQuery を使用しています。

$.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」はオブジェクトへの参照であり、通常どおりドット表記を使用してすべてのオブジェクトメンバーにアクセスします。

于 2012-10-20T03:54:27.833 に答える