Upload JSON via WebClient

前端 未结 2 1729
后悔当初
后悔当初 2021-01-17 23:48

I have a web app with that is using JQuery to interact with my backend. The backend successfully accepts JSON data. For instance, I can successfully send the following JSON:

相关标签:
2条回答
  • 2021-01-18 00:10

    Although the question is already answered, I thought it would be nice to share my simple JsonService, based on the WebClient:

    Base class

    /// <summary>
    /// Class BaseJsonService.
    /// </summary>
    public abstract class BaseJsonService
    {
        /// <summary>
        /// The client
        /// </summary>
        protected WebClient client;
    
        /// <summary>
        /// Gets the specified URL.
        /// </summary>
        /// <typeparam name="TResponse">The type of the attribute response.</typeparam>
        /// <param name="url">The URL.</param>
        /// <param name="onComplete">The configuration complete.</param>
        /// <param name="onError">The configuration error.</param>
        public abstract void Get<TResponse>(string url, Action<TResponse> onComplete, Action<Exception> onError);
        /// <summary>
        /// Sends the specified URL.
        /// </summary>
        /// <typeparam name="TResponse">The type of the attribute response.</typeparam>
        /// <param name="url">The URL.</param>
        /// <param name="jsonData">The json data.</param>
        /// <param name="onComplete">The configuration complete.</param>
        /// <param name="onError">The configuration error.</param>
        public abstract void Post<TResponse>(string url, string jsonData, Action<TResponse> onComplete, Action<Exception> onError);
    }
    

    Service implementation

    /// <summary>
        /// Class JsonService.
        /// </summary>
        public class JsonService : BaseJsonService
        {
            /// <summary>
            /// Gets the specified URL.
            /// </summary>
            /// <typeparam name="TResponse">The type of the attribute response.</typeparam>
            /// <param name="url">The URL.</param>
            /// <param name="onComplete">The configuration complete.</param>
            /// <param name="onError">The configuration error.</param>
            public override void Get<TResponse>(string url, Action<TResponse> onComplete, Action<Exception> onError)
            {
                if (client == null)
                    client = new WebClient();
    
                client.DownloadStringCompleted += (s, e) =>
                {
                    TResponse returnValue = default(TResponse);
    
                    try
                    {
                        returnValue = JsonConvert.DeserializeObject<TResponse>(e.Result);
                        onComplete(returnValue);
                    }
                    catch (Exception ex)
                    {
                        onError(new JsonParseException(ex));
                    }
                };
    
                client.Headers.Add(HttpRequestHeader.Accept, "application/json");
                client.Encoding = System.Text.Encoding.UTF8;
    
                client.DownloadStringAsync(new Uri(url));
            }
            /// <summary>
            /// Posts the specified URL.
            /// </summary>
            /// <typeparam name="TResponse">The type of the attribute response.</typeparam>
            /// <param name="url">The URL.</param>
            /// <param name="jsonData">The json data.</param>
            /// <param name="onComplete">The configuration complete.</param>
            /// <param name="onError">The configuration error.</param>
            public override void Post<TResponse>(string url, string jsonData, Action<TResponse> onComplete, Action<Exception> onError)
            {
                if (client == null)
                    client = new WebClient();
    
                client.UploadDataCompleted += (s, e) =>
                {
                    if (e.Error == null && e.Result != null)
                    {
                        TResponse returnValue = default(TResponse);
    
                        try
                        {
                            string response = Encoding.UTF8.GetString(e.Result);
                            returnValue = JsonConvert.DeserializeObject<TResponse>(response);
                        }
                        catch (Exception ex)
                        {
                            onError(new JsonParseException(ex));
                        }
    
                        onComplete(returnValue);
                    }
                    else
                        onError(e.Error);
                };
    
                client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
                client.Encoding = System.Text.Encoding.UTF8;
    
                byte[] data = Encoding.UTF8.GetBytes(jsonData);
                client.UploadDataAsync(new Uri(url), "POST", data);
            }
        }
    

    Example usage

        /// <summary>
        /// Determines whether this instance [can get result from service].
        /// </summary>
        [Test]
        public void CanGetResultFromService()
        {
            string url = "http://httpbin.org/ip";
            Ip result;
    
            service.Get<Ip>(url,
            success =>
            {
                result = success;
            },
            error =>
            {
                Debug.WriteLine(error.Message);
            });
    
            Thread.Sleep(5000);
        }
        /// <summary>
        /// Determines whether this instance [can post result automatic service].
        /// </summary>
        [Test]
        public void CanPostResultToService()
        {
            string url = "http://httpbin.org/post";
            string data = "{\"test\":\"hoi\"}";
            HttpBinResponse result = null;
    
            service.Post<HttpBinResponse>(url, data,
                response =>
                {
                    result = response;
                },
                error =>
                {
                    Debug.WriteLine(error.Message);
                });
    
            Thread.Sleep(5000);
        }
    }
    public class Ip
    {
        public string Origin { get; set; }
    }
    public class HttpBinResponse
    {
        public string Url { get; set; }
        public string Origin { get; set; }
        public Headers Headers { get; set; }
        public object Json { get; set; }
        public string Data { get; set; }
    }
    public class Headers
    {
        public string Connection { get; set; }
        [JsonProperty("Content-Type")]
        public string ContentType { get; set; }
        public string Host { get; set; }
        [JsonProperty("Content-Length")]
        public string ContentLength { get; set; }
    }
    

    Just to share some knowledge!

    Good luck!

    0 讨论(0)
  • 2021-01-18 00:34

    Figured it out. I was forgetting the following:

    myService.Headers.Add("Content-Type", "application/json");
    
    0 讨论(0)
提交回复
热议问题