从C#发送json中的REST over SSL发送请求

时间:2016-11-22 09:49:59

标签: c# json ssl

我查了谷歌上的每一页都没有明确的答案 现在这是我的代码:

try
{
    var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api.hesabit.com/oauth2/token");
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Method = "POST";
    httpWebRequest.Credentials = CredentialCache.DefaultCredentials;
    ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

    string result_st;

    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    {
        string json = "{\"code\":\"{atho code}\"," +
                       "\"grant_type\":\"authorization_code\"," +
                       "\"client_id\":\"{client_id}\"," +
                       "\"client_secret\":\"{client_secret}\"," +
                       "\"redirect_uri\":\"{redirect_uri}\"}";
        streamWriter.Write(json);
        streamWriter.Flush();
        streamWriter.Close();
    }

    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();

    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
        result_st = result;
    }

    return result_st;
}
catch (Exception ex)
{
    return ex.ToString();
}

2 个答案:

答案 0 :(得分:2)

您的代码看起来非常粗糙,您应该使用一些有用的库,例如Newtonsoft.JSONRestSharp

答案 1 :(得分:1)

在.NET 4.0中,您可以使用

public TResponse Send<TRequest, TResponse>(string url, TRequest request)
{
        var webRequest = (HttpWebRequest)WebRequest.Create(url);

        webRequest.Method = WebRequestMethods.Http.Post;
        webRequest.ContentType = "application/json";

        ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

        var json = Newtonsoft.Json.JsonConvert.SerializeObject(request);
        using (var requestStream = webRequest.GetRequestStream())
        {
            using (var writer = new StreamWriter(requestStream))
            {
                writer.Write(json);
            }
        }

        try
        {
            using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
            {
                using (var responseStream = webResponse.GetResponseStream())
                {
                    using (var reader = new StreamReader(responseStream))
                    {
                        var responseData = reader.ReadToEnd();
                        webResponse.Close();

                        return Newtonsoft.Json.JsonConvert.DeserializeObject<TResponse>(responseData);
                    }
                }
            }
        }
        catch (WebException ex)
        {
            throw ProcessWebException(ex); // ToDo
        }
}

在NET 4.5中,您可以使用

public async Task<TResponse> ExecuteAsync<TRequest, TResponse>(string url, TRequest request)
{
    ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

    using (var handler = new HttpClientHandler() {})
    {
        using (var client = new HttpClient(handler))
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var json = Newtonsoft.Json.JsonConvert.SerializeObject(request);
            var httpContent = new StringContent(json, Encoding.UTF8, "application/json");

            var processResult = await client.PostAsync(url, httpContent);
            var responseBody = processResult.Content.ReadAsStringAsync().Result;

            return Newtonsoft.Json.JsonConvert.DeserializeObject<TResponse>(responseBody);
        }
    }
}

在示例中,我使用Newtonsoft.Json库。