Почему мой запрос POST API продолжает сбой? - PullRequest
0 голосов
/ 17 января 2019

Я делаю запрос API Post и не могу заставить его работать. Я всегда получаю webexception sendFailure, и ответ на исключение всегда нулевой, поэтому перехват исключения бесполезен. Это происходит, когда я пытаюсь получить httpWebResponse. Я также заметил, что request.contentlength выдавал ошибки в getrequeststream postream, поэтому я закомментировал это. Test.json - это файл, который я использую для тела запроса. Я также проверил это на разных API-тестерах, включив URL, тело и тип содержимого в заголовок, и они работали. Я просто не могу кодировать это для себя. Учетные данные работают, я просто не знаю, правильно ли я делаю запрос?

Файл 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 голосов
/ 17 января 2019

Я предлагаю изменить ваш запрос, следуя этому формату. Особенно обратите внимание на 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
            }
...