为什么我的API POST请求始终失败?

时间:2019-01-16 21:07:58

标签: c# json api post httprequest

我正在执行API Post请求,但似乎无法使其正常工作。我总是收到一个sendFailure webexception,并且该异常的响应始终为null,因此捕获该异常是没有用的。当我尝试获取httpWebResponse时,它一直在发生。我也注意到request.contentlength在postream getrequeststream上给出了错误,所以我注释掉了。 Test.json是我用于请求正文的文件。我还通过在标头中包含URL,正文和content-type在不同的API测试器上进行了测试,并且它们可以正常工作。我似乎无法为自己编写代码。凭据的工作我不知道即时消息是否正确执行了请求?

JSON文件:

{
"email": "abc@123.com", 
"password": "12345", 
"facilityNumber": "987654"
}

string filepath = "test.json";

string result = string.Empty;

using (StreamReader r = new StreamReader(filepath))
{

   var json = r.ReadToEnd();

   var jobj = JObject.Parse(json);

   foreach (var item in jobj.Properties())
   {

      item.Value = item.Value.ToString().Replace("v1", "v2");
   }

   result = jobj.ToString();

   Console.WriteLine(result);
}

try
{

   string setupParameters;

   HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.test.com/abcde");

   request.AllowAutoRedirect = true;

   setupParameters = result;

   ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;

   ASCIIEncoding encoding = new ASCIIEncoding();

   var postData = setupParameters;

   request.Method = "POST";

   request.ContentType = "application/json";

   byte[] data = encoding.GetBytes(postData);

   //request.ContentLength = data.Length;

   using (StreamWriter postStream = new StreamWriter(request.GetRequestStream()))//error if uncomment contentlength
   {

      postStream.Write(postData);

      postStream.Flush();

      postStream.Close();
   }

   HttpWebResponse wr = (HttpWebResponse)request.GetResponse();//error occurs

   Stream receiveStream = wr.GetResponseStream();

   StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
}
catch (WebException ex)
{

   if (ex.Response != null)
   {

      using (var errorResponse = (HttpWebResponse)ex.Response)
      {

        using (var reader = new StreamReader(errorResponse.GetResponseStream()))
        {

           string error = reader.ReadToEnd();

           result = error;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我建议修改您的请求以遵循这种格式。特别要注意多次引起我注意的request.Method和request.ContentType。 而且,通过这种方式处理响应更加容易。

try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(YOURURL);
                request.ContentType = "application/json; charset=utf8";
                request.Headers.Add(ADD HEADER HERE IF YOU NEED ONE);
                request.Method = WebRequestMethods.Http.Post; // IMPORTANT

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                     streamWriter.Write(JsonConvert.SerializeObject(JSONBODYSTRING)); 
// I USUALLY YOU JSONCONVERT HERE TO SIMPLY SERIALIZE A STRING CONTAINING THE JSON INFO. 
//BUT I GUESS YOUR METHOD WOULD ALSO WORK
                    streamWriter.Flush();
                    streamWriter.Close();
                }

                WebResponse response = request.GetResponse();
                using (var streamReader = new StreamReader(response.GetResponseStream()))
                {
                    string result = streamReader.ReadToEnd();
                    // DO WHATEVER YOU'D LIKE HERE
                }
            } catch (Exception ex)
            {
               // HANDLE YOUR EXCEPTIONS
            }