none
Requição PHP por POST RRS feed

  • Pergunta

  • Boa tarde Pessoal,

    Estou desenvolvendo um pequeno projeto no qual realizo inserção/consultas/alterações no banco de dados através de chamadas PHP, quando eu insiro um valor funciona corretamente, agora pra buscar está dando erro no webRequest.GetResponse(), retornando erro 500, abaixo os meu código caso alguem possa me ajudar:

    O método ExecutarSQLValores funciona para inserir valores no BD retornando da mesma forma um array (mas com apenas um valor, não varios como o de busca) e funciona corretamente.

    PHP SELECT

    <?php
    	include "db.php";
    
    	$nome = $_POST["nome"];		
    
    	if ($_POST["nome"] == "x"){
    		$sql_verifica = 'SELECT * FROM membros';
    		$exec_row = $conn->query($sql_verifica);
    
    		$result = array();
    
    		while($info = $exec_row->fetch_assoc()){
    			$result[] = $info;
    		}
    		echo json_encode($result);	
    
    		$stm->close();
    		$conn->close();
    	}	
    ?>

    Método pra chamada da URL passando um parametro de exemplo (tentei sem parametro também e da erro:

    private JToken ExecutarSQLValores(string url, string jsonParametros)
            {
                var webRequest = (HttpWebRequest)WebRequest.Create(url);
                webRequest.Method = "POST";
                JToken listaDinamica;
                webRequest.ContentType = "application/x-www-form-urlencoded";
                using (StreamWriter sw = new StreamWriter(webRequest.GetRequestStream())) sw.Write(jsonParametros);
                HttpWebResponse httpWebResponse = webRequest.GetResponse() as HttpWebResponse; //DA O ERRO 500 AQUI
                using (Stream sr = httpWebResponse.GetResponseStream())
                {
                    if (httpWebResponse.StatusCode != HttpStatusCode.OK) throw new Exception(String.Format("Falha ao realizar operação. Received HTTP {0}", httpWebResponse.StatusCode));
                    else
                    {
                        using (var reader = new StreamReader(sr))
                        {
                            string json = reader.ReadToEnd();
                            json = "{\"valores\":" + json + "}";
                            listaDinamica = JsonConvert.DeserializeObject<JToken>(json);
                        }
                    }
                }
                return listaDinamica;
            }

    Código da chamada do método acima:

    public DataTable BuscarMembros()
            {
                url = "http://tritetodevelopers.esy.es/select_membro.php/";
                jsonParametros = "nome=x";
                dt.Columns.Add("nome");
                JToken listaDinamica = ExecutarSQLValores(url, jsonParametros);
                var lista = listaDinamica.Select(x => ((JProperty)x).Value.ToObject<Modelo.Membro>()).ToList();
    
                foreach (var item in lista)
                {
                    dt.Rows.Add(item.nome);
                }
                return dt;
            }

    Agradeço desde ja a ajuda!

    segunda-feira, 19 de março de 2018 17:33

Respostas

  • Olá amigo bom dia,

    Vamos adicionar um tratamento de exceção para avaliar o retorno, tente assim:

               var post_data = "nome=x";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://tritetodevelopers.esy.es/select_membro.php");
                request.ContentType = "application/x-www-form-urlencoded";
                request.Method = "POST";
                var data = Encoding.GetEncoding("ISO-8859-1").GetBytes(post_data);
                request.ContentLength = data.Length;
                using (var stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
    
    
                HttpWebResponse response = null;
    
    
                try
                {
                    response = (HttpWebResponse)request.GetResponse();
                }
                catch (WebException ex)
                {
                    response = (HttpWebResponse)ex.Response;
                }
    
                string result;
    
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    result = sr.ReadToEnd(); //seu resultado final
                }
    
                int status = (int)response.StatusCode;
    
                response.Close();

    Espero ter ajudado! Um abraço!

    terça-feira, 20 de março de 2018 14:53
  • Olá boa tarde,

    Você pode criar uma estrutura de objetos para deserializar o resultado ex:

        public class ResultadoPesquisa
        {
            public ResultadoPesquisa()
            {
                this.valores = new List<DadoRetorno>();
            }
            public List<DadoRetorno> valores { get; set; }
        }
    
        public class DadoRetorno
        {
            public int idMembro { get; set; }
    
            public string nome { get; set; }
        }


    No request altere:

              using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    result = "{\"valores\":" + sr.ReadToEnd() + "}";
                    var listaRetorno = JsonConvert.DeserializeObject<ResultadoPesquisa>(result);
                }

    Espero ter ajudado!

    Um abraço!

     
    terça-feira, 20 de março de 2018 20:37

Todas as Respostas

  • Tente assim:

    private JToken ExecutarSQLValores(string url, string jsonParametros)
            {
                byte[] buffer = Encoding.ASCII.GetBytes(jsonParametros);
                var webRequest = (HttpWebRequest)WebRequest.Create(url);
                webRequest.Method = "POST";
                JToken listaDinamica;
                webRequest.ContentType = "application/x-www-form-urlencoded";
                webRequest.ContentLength = buffer.Length;
                using (StreamWriter sw = new StreamWriter(webRequest.GetRequestStream())) 
                {
                    sw.Write(buffer, 0, buffer.Length);
                    sw.Close();
                }
                HttpWebResponse httpWebResponse = webRequest.GetResponse() as HttpWebResponse; //DA O ERRO 500 AQUI
                using (Stream sr = httpWebResponse.GetResponseStream())
                {
                    if (httpWebResponse.StatusCode != HttpStatusCode.OK) throw new Exception(String.Format("Falha ao realizar operação. Received HTTP {0}", httpWebResponse.StatusCode));
                    else
                    {
                        using (var reader = new StreamReader(sr))
                        {
                            string json = reader.ReadToEnd();
                            json = "{\"valores\":" + json + "}";
                            listaDinamica = JsonConvert.DeserializeObject<JToken>(json);
                        }
                    }
                }
                return listaDinamica;
            }
    
    


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.


    segunda-feira, 19 de março de 2018 17:59
  • Obrigado pelo retorno Juliano,

    Mas realmente não funcionou, o buffer da linha "sw.Write(buffer, 0, buffer.Length);" reclama que deve ser do tipo char[] e não byte[], ai eu colocando "sw.Write(System.Text.Encoding.UTF8.GetString(buffer).ToCharArray(), 0, buffer.Length);" roda mas da o mesmo erro 500 na mesma linha que mencionei no começo,

    Alguma outra solução?

    segunda-feira, 19 de março de 2018 20:55
  • O erro sobre byte[] foi falta de atenção minha. A linha 

    using (StreamWriter sw = new StreamWriter(webRequest.GetRequestStream())

    deveria ser

    using (Stream sw = webRequest.GetRequestStream())


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    terça-feira, 20 de março de 2018 01:36
  • Olá amigo bom dia,

    Vamos adicionar um tratamento de exceção para avaliar o retorno, tente assim:

               var post_data = "nome=x";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://tritetodevelopers.esy.es/select_membro.php");
                request.ContentType = "application/x-www-form-urlencoded";
                request.Method = "POST";
                var data = Encoding.GetEncoding("ISO-8859-1").GetBytes(post_data);
                request.ContentLength = data.Length;
                using (var stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
    
    
                HttpWebResponse response = null;
    
    
                try
                {
                    response = (HttpWebResponse)request.GetResponse();
                }
                catch (WebException ex)
                {
                    response = (HttpWebResponse)ex.Response;
                }
    
                string result;
    
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    result = sr.ReadToEnd(); //seu resultado final
                }
    
                int status = (int)response.StatusCode;
    
                response.Close();

    Espero ter ajudado! Um abraço!

    terça-feira, 20 de março de 2018 14:53
  • A ultima solução dada pelo Edson funcionou, só há um probleminha agora, se puder ajudar,

    public DataTable BuscarMembros()
            {
                url = "http://tritetodevelopers.esy.es/select_membro.php/";
                jsonParametros = "nome=x";
                dt.Columns.Add("nome");
                JToken listaDinamica = ExecutarSQLValores(url, jsonParametros);
                var lista = listaDinamica.Select(x => ((JProperty)x).Value.ToObject<Modelo.Membro>()).ToList(); // O ERRO MENCIONADO ACONTECE AQUI
    
                foreach (var item in lista)
                {
                    dt.Rows.Add(item.nome);
                }
                return dt;
            }

    Para cadastro funciona corretamente, mas pra busca mesmo retornando os valores para a variavel listaDinamica, estou encontrando problema na transição para a variavel lista, com o seguinte erro:

    "

    Additional information: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'teste.Modelo.Membro' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

    To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array."



    terça-feira, 20 de março de 2018 17:43
  • Olá boa tarde,

    Você pode criar uma estrutura de objetos para deserializar o resultado ex:

        public class ResultadoPesquisa
        {
            public ResultadoPesquisa()
            {
                this.valores = new List<DadoRetorno>();
            }
            public List<DadoRetorno> valores { get; set; }
        }
    
        public class DadoRetorno
        {
            public int idMembro { get; set; }
    
            public string nome { get; set; }
        }


    No request altere:

              using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    result = "{\"valores\":" + sr.ReadToEnd() + "}";
                    var listaRetorno = JsonConvert.DeserializeObject<ResultadoPesquisa>(result);
                }

    Espero ter ajudado!

    Um abraço!

     
    terça-feira, 20 de março de 2018 20:37