опрос сервера после POST 201 CREATED c # - PullRequest
0 голосов
/ 14 октября 2018

Я, вероятно, допустил действительно глупую ошибку, я могу сделать успешный POST-запрос к серверу.Я также могу получить ответ от сервера 201, а также просматривать json("requestid").Я могу десериализовать JSON и разобрать requestid как строку (public string requestID).У меня установлен таймер (timer1) для опроса сервера каждую 1 секунду, опрос должен начаться успешно, если 201 создан и работает.Однако проблема, которую я имею, состоит в том, что это не включает requestid.Кто-нибудь сможет посоветовать и сказать мне, где я ошибся, пожалуйста?

namespace RestAPI
{
    public enum httpVerb
    {
        GET,
        POST,
        PUT,
        DELETE
    }


    class RESTAPI
    {
        public string endPoint { get; set; }
        public httpVerb httpMethod { get; set; }
        public string userPassword { get; set; }
        public int sendAmount { get; set; }
        public string location { get; set; }

        public string requestId { get; set; }



        public RESTAPI()
        {
            endPoint = string.Empty;
            httpMethod = httpVerb.GET;
            userPassword = string.Empty;
            //requestId = string.Empty; 

        }

        public string makeRequest()
        {
            string strResponseValue = string.Empty;
            string result = string.Empty;



            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);
            request.Method = httpMethod.ToString();
            request.ContentType = "application/json";
            request.Accept = "application/connect.v1+json";

            String username = "mokhan";
            String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + userPassword));
            request.Headers.Add("Authorization", "Basic " + encoded);

            if(httpMethod == httpVerb.POST)
            {
                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    string json = "{\"transactionType\":\"SALE\"," + "\"amount\":" + sendAmount + "," +
                                  "\"currency\":\"GBP\"}";

                    streamWriter.Write(json);
                    streamWriter.Flush();
                    streamWriter.Close();
                }



                HttpWebResponse responseback = (HttpWebResponse)request.GetResponse();
                //string result;
                using (StreamReader rdr = new StreamReader(responseback.GetResponseStream()))
                {

                    result = rdr.ReadToEnd();
                }


                if (responseback.StatusCode == HttpStatusCode.Created)
                {
                    dynamic jsonObj = JsonConvert.DeserializeObject(result);
                    requestId = jsonObj.requestId.ToString();
                    return requestId;
                }
                return result;

            }

            HttpWebResponse response = null;

            try
            {                
                response = (HttpWebResponse)request.GetResponse();
                using (Stream responseStream = response.GetResponseStream())
                    {
                       if (responseStream != null)
                          {
                            using (StreamReader reader = new StreamReader(responseStream))
                            {
                                strResponseValue = reader.ReadToEnd();
                            }
                        }   
                    }                 
                }


            catch (Exception ex)
            {

            }

            finally
                {
                    if (response != null)
                    {
                        ((IDisposable)response).Dispose();
                    }
                }

                return strResponseValue;
            }

    }
}

Этот код ниже показывает мои запросы POST и GET к серверу, я добавил метод таймера для запуска в моем запросе POST послеЯ получил ответ и добавил код для опроса в моем методе таймера.Я также установил строку transactionid = rclient.requestId; и вызываемый rclient.endPoint = "https://" + txtBox.Text + "/pac" + "/terminals/" + txtBox3.Text + "/transactions/" + transactionid; для опроса сервера каждую 1 секунду, но по какой-то причине он не получает transactionid.

namespace RestAPI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void go_Click(object sender, EventArgs e)
        {
            RESTAPI rclient = new RESTAPI();
            rclient.endPoint = "https://" + txtBox.Text + "/pac" + "/terminals/" + txtBox3.Text;
            rclient.userPassword = txtbox2.Text;
            debugOutput("REQUEST SENT");
            string strResponse = string.Empty;
            strResponse = rclient.makeRequest();

            debugOutput(strResponse);
        }

        private void debugOutput(string strDebugText)
        {
            try
            {
                System.Diagnostics.Debug.Write(strDebugText + Environment.NewLine);
                txtBoxResponse.Text = txtBoxResponse.Text + strDebugText + Environment.NewLine;
                txtBoxResponse.SelectionStart = txtBoxResponse.TextLength;
                txtBoxResponse.ScrollToCaret();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.Write(ex.Message, ToString() + Environment.NewLine);

            }
        }

        private void txtBox_TextChanged(object sender, EventArgs e)
        {

        }

        private void Test_Click(object sender, EventArgs e)
        {
            RESTAPI rclient = new RESTAPI();
            rclient.httpMethod = httpVerb.POST;
            rclient.sendAmount = Convert.ToInt32(amount.Text);
            rclient.endPoint = "https://" + txtBox.Text + "/pac" + "/terminals/" + txtBox3.Text + "/transactions";
            rclient.userPassword = txtbox2.Text;

            debugOutput("REQUEST SENT");

            string strResponse = string.Empty;
            strResponse = rclient.makeRequest();
            debugOutput(strResponse);


            timer1.Start();


    }
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            RESTAPI rclient = new RESTAPI();
            rclient.httpMethod = httpVerb.GET;
            string transactionid = rclient.requestId;
            rclient.endPoint = "https://" + txtBox.Text + "/pac" + "/terminals/" + txtBox3.Text + "/transactions/" + transactionid; 
            debugOutput("REQUEST SENT");
            string strResponse = string.Empty;
            strResponse = rclient.makeRequest();
            debugOutput(strResponse);
        }
    }
}

1 Ответ

0 голосов
/ 14 октября 2018

Только что решил проблему, в моем публичном классе RESTAPI я откомментировал это // requestId = string.Empty;После этого я смог подобрать идентификатор запроса в виде строки, а затем вызвать его в моей строке таймера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...