C#JSON Post使用HttpWebRequest

时间:2016-03-16 21:35:27

标签: c# json

我是JSON和C#的新手,并尝试编写一个代码来执行http Web请求POST以获取令牌。下面是我的代码,但我一直得到400个错误的请求。可能我的代码不正确,我会感谢你对此有任何帮助。以下是我的代码:

    static public string GetAuthorizationToken()
                {
                    string token = string.Empty;

                    string requestUrl = "some URL";
                    HttpWebRequest httpWebRequest = WebRequest.Create(requestUrl) as HttpWebRequest;
                    httpWebRequest.Method = "POST";
                    httpWebRequest.ContentType = "x-www-form-urlencoded";


                    Dictionary<string, string> postParameters = new Dictionary<string, string>();
                    postParameters.Add("grant", "some credentials");
                    postParameters.Add("id", "1234123411");
                    postParameters.Add("secret", "1234123411");
                    postParameters.Add("scope", "abcd");

                    string postData = "";

                    foreach (string key in postParameters.Keys)
                    {
                        postData += WebUtility.UrlEncode(key) + "="
                              + WebUtility.UrlEncode(postParameters[key]) + "&";
                    }                       

                    byte[] data = Encoding.ASCII.GetBytes(postData);

                    httpWebRequest.ContentLength = data.Length;

                    Stream requestStream = httpWebRequest.GetRequestStream();
                    requestStream.Write(data, 0, data.Length);
                    requestStream.Close();

                    TokenResponse tokenResponse = new TokenResponse();

                    using (HttpWebResponse response = httpWebRequest.GetResponse() as HttpWebResponse)
                    {
                        if (response.StatusCode != HttpStatusCode.OK)
                            throw new Exception(String.Format(
                            "Server error (HTTP {0}: {1}).",
                            response.StatusCode,
                            response.StatusDescription));

                        DataContractJsonSerializer responseSerializer = new DataContractJsonSerializer(typeof(TokenResponse));
                        Stream responseStream = response.GetResponseStream();
                        object objResponse = responseSerializer.ReadObject(responseStream);

                        tokenResponse = objResponse as TokenResponse;
                        response.Close();

                        if (tokenResponse != null)
                        {
                            return tokenResponse.accessToken;
                        }
                    }
                    return token;
    }

2 个答案:

答案 0 :(得分:23)

这是POST请求和读取响应的精确而准确的示例(尽管没有序列化JSON数据)。只有我在你的代码中看到的错误是一个不正确的ContentType,我们也看不到你试图发送服务器的URL(但可能性是错误的)。希望它能帮助你前进。

using System;
using System.Collections.Generic;
using System.Net;
using System.IO;

namespace SExperiment
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            try{
                string webAddr="http://gurujsonrpc.appspot.com/guru";

                var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
                httpWebRequest.ContentType = "application/json; charset=utf-8";
                httpWebRequest.Method = "POST";    

                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    string json = "{ \"method\" : \"guru.test\", \"params\" : [ \"Guru\" ], \"id\" : 123 }";

                    streamWriter.Write(json);
                    streamWriter.Flush();
                }
                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var responseText = streamReader.ReadToEnd();
                    Console.WriteLine(responseText);

                    //Now you have your response.
                    //or false depending on information in the response     
                }
            }catch(WebException ex){
                Console.WriteLine(ex.Message);
            }
        }
    }
}

答案 1 :(得分:-3)

您已将requestUrl设置为&#34;某些网址&#34;。除了将内容类型更改为&#34; application / json&#34;之外,请尝试使用现有的网址。