【问题标题】:Sending data from a C # application using the POST method [closed]使用 POST 方法从 C# 应用程序发送数据 [关闭]
【发布时间】:2018-02-16 06:21:54
【问题描述】:

任务是将json中的类序列化并传递给服务器上的POST。我写了代码,它可以工作,但我有一种感觉,我做了很多不必要的事情。提示好的做法来解决我的问题。

//package - a serializable object that must be passed
JsonPackage package = new JsonPackage( userData ); 
DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer( typeof( JsonPackage ) );

WebRequest request = WebRequest.Create( "http://localhost:52733/set" );
request.ContentType = "application/json";
request.Method = "POST";

MemoryStream ms = new MemoryStream();

jsonFormatter.WriteObject( ms, package );

ms.Flush();
ms.Position = 0;

StreamReader sr = new StreamReader( ms );
string jsonString = sr.ReadToEnd();

StreamWriter sw = new StreamWriter( request.GetRequestStream() );
sw.Write( jsonString );

sr.Dispose();
sw.Dispose();
ms.Dispose();
request.GetResponse();

更新 感谢大家的回答,让我学到了很多东西。我接受了另一个建议,并写如下:

//package - a serializable object that must be passed
JsonPackage package = new JsonPackage( Data );
DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer( typeof( JsonPackage ) );

WebRequest request = WebRequest.Create( "http://localhost:52733/set" );
request.ContentType = "application/json";
request.Method = "POST";

using ( var stream = request.GetRequestStream() )
{
    jsonFormatter.WriteObject( stream, package );
}
request.GetResponse();

告诉我我的决定有缺陷吗?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您确实可以使用HttpClient 及其PostAsJsonAsync 方法来减少行数。由于该方法是异步的,并且我假设您的代码所在的方法可能不是您需要访问PostAsJsonAsync 的等待器以获取请求的结果。

    var client = new HttpClient();
    
    // response is an HttpResponseMessage instance
    var response = client.PostAsJsonAsync("http://localhost:52733/set", userData)
                         .GetAwaiter().GetResult();
    

    您还可以在此处获取有关HttpClient 用法的更多详细信息:https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client

    【讨论】:

    • 我的 HttpClient 不包含 PostAsJsonAsync,怎么回事?也许是因为我使用的是 .net core?
    • 在.net core中好像是一种扩展方式,更多细节可以看:stackoverflow.com/questions/40027299/…
    【解决方案2】:

    如果您使用NewtonSoft.Json,序列化步骤将是一个简单的JsonConvert.SerializeObject(<<object>>)。希望这会有所帮助。\

    以下是您的代码的简化版本。

                var client = new System.Net.Http.HttpClient();
    
                var content = new     StringContent(JsonConvert.SerializeObject(data));
                client.BaseAddress = new Uri("http://localhost:52733/");
                client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                var response = client.PostAsync("set", content).Result;
                //do what ever you want to do with response
    

    【讨论】:

    • 感谢您的帮助。但我不使用 NewtonSoft。我不想拖动额外的库。
    • 如果您不想使用NewtonSoft.Json,请使用此link。 .但我相信微软自己建议使用JSON.Net。
    【解决方案3】:

    希望能帮上忙。我使用restSharp。 要使用它,你需要安装 RestSharp

    http://restsharp.org/ https://www.nuget.org/packages/RestSharp/106.3.0-alpha0002

    和 NewtonSoft.Json 。

    https://www.nuget.org/packages/newtonsoft.json/

    private bool Post(<<DataStaructure>> inputParam)
        {
            var jsonSerializerSettings =
                new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
    
            var client = new RestClient("http://localhost:52733/set/");
            var request = new RestRequest(Method.POST);
            var jsonToSend = JsonConvert.SerializeObject(inputParam, jsonSerializerSettings);
            request.AddParameter("application/json; charset=utf-8", jsonToSend, ParameterType.RequestBody);
            IRestResponse response = client.Execute(request);
    
            if (response.IsSuccessful == false)
            {
                throw new Exception(response.ErrorMessage);
            }
            else
            {
                return Convert.ToBoolean(response.Content);
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多