【问题标题】:Getting Json Data using HttpWebRequests使用 HttpWebRequests 获取 Json 数据
【发布时间】:2020-06-16 12:15:40
【问题描述】:

如何使用 C# 使用 HttpRequest 发送 Json

我有这个代码,但它可以工作,并返回这样的结果

"[{\"Fullname\":\"John Snow\",\"Telephone\":\"08147720192\",\"gender\":\"Male\",\"email\":\"john.snow@gmail.com\",\"date_ofbirth\":\"1985-06-22T00:00:00\",\"nationalID\":\"JS834788US\",\"accountnumber\":\"0034773291\",\"salary\":800000.00}]"

我宁愿希望它在没有 [] 的情况下返回

所以它应该是这样的:

string json = "{\"Fullname\":\"John Snow\",\"Telephone\":\"08147720192\",\"gender\":\"Male\",\"email\":\"john.snow@gmail.com\",\"date_ofbirth\":\"1985-06-22T00:00:00\",\"nationalID\":\"JS834788US\",\"accountnumber\":\"0034773291\",\"salary\":800000.00}";

所以很容易阅读,C#源代码长这样:

      public static Object GETRESTInfo(string restUrl, string reqMethod)
        {
            var request = (HttpWebRequest)WebRequest.Create(restUrl);
            var response = (HttpWebResponse)request.GetResponse();

            var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
            return responseString;
}

在这里需要帮助,我对 HttpWebRequests 很陌生

已更新。 这是我提出请求的代码

using EmployeeRESTAPI.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace EmployeeRESTAPI.Controllers
{
    public class EmployeeDBController : ApiController
    {
        string MyconnectionString = "Data Source=DLX;Initial Catalog=EmployeeDB;Integrated Security=True";
        // GET api/<controller>
        public IEnumerable<EmployeeDB> Get()
        {
            SqlConnection con = new SqlConnection(MyconnectionString);
            DataTable dt = new DataTable();
            con.Open();

            string query = "select* from [EmployeeDB].[dbo].[EmployeeTable]";
            SqlDataAdapter adapter = new SqlDataAdapter(query, con);
            adapter.Fill(dt);

            List<EmployeeDB> empdb = new List<Models.EmployeeDB>(dt.Rows.Count);
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow empdbrecord in dt.Rows)
                {
                    empdb.Add(new ReadEmployee(empdbrecord));
                }
            }
            return empdb;
        }

        // GET api/<controller>/5
        public IEnumerable<EmployeeDB> Get(string accountnumber)
        {
            SqlConnection con = new SqlConnection(MyconnectionString);
            DataTable dt = new DataTable();
            con.Open();

            string query = "select * from [EmployeeDB].[dbo].[EmployeeTable] where accountnumber = '" + accountnumber + "'";
            SqlDataAdapter adapter = new SqlDataAdapter(query, con);
            adapter.Fill(dt);

            List<EmployeeDB> empdb = new List<Models.EmployeeDB>(dt.Rows.Count);
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow empdbrecord in dt.Rows)
                {
                    empdb.Add(new ReadEmployee(empdbrecord));
                }
            }
            return empdb;
        }

        // POST api/<controller>
        public void Post([FromBody]string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
    }
}

【问题讨论】:

  • HttpServer也是自己做的吗?由于服务器发送响应,您必须更改服务器代码,因此 http 请求与此无关。但是您可以删除字符串的括号(第一个和最后一个字符)或解析 json 字符串并返回列表的第一个元素。
  • 我已经构建了 REST api,结果是我展示给你的第一个 Json。有没有办法,我可以直接从代码中返回没有括号的 Json?
  • 您必须向我们展示发送响应的服务器代码,因为这是服务器端的问题,而不是来自客户端本身。
  • 我猜你的意思是数据库?从数据库中检索数据的那个?我已经更新了代码。
  • Get 返回 IEnumerable。如果您只想返回一个,则更改签名并返回单个项目。

标签: c# json rest


【解决方案1】:

您必须返回单个员工而不是 IEnumerable:

public EmployeeDB Get(string accountnumber)
    {
        SqlConnection con = new SqlConnection(MyconnectionString);
        DataTable dt = new DataTable();
        con.Open();

        string query = "select * from [EmployeeDB].[dbo].[EmployeeTable] where accountnumber = '" + accountnumber + "'";
        SqlDataAdapter adapter = new SqlDataAdapter(query, con);
        adapter.Fill(dt);

        if (dt.Rows.Count > 0)
        {
            return new ReadEmployee(dt.Rows[0]);
        }

        throw new Exception("Account not found"); 
    }

正如@Mike Cheel 所说,您的查询可能会被 SQL 注入利用,通过在您的 SQL 查询中使用参数来修复它

【讨论】:

  • 它抱怨 empdbrecord 不存在。为什么会这样??
  • 现在可以用了吗?我忘记正确更改所有内容。请注意,我还更改了方法的返回类型
  • 仍然在该区域出现错误 return new ReadEmployee(dt.Rows[0])
  • 唉,没关系,它现在删除了 []。 @Paul 谢谢。
猜你喜欢
  • 2016-06-05
  • 2018-02-11
  • 2021-07-15
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多