WinForm使用POST请求方式向WebApi传递参数始终为空

2 篇文章 0 订阅

案例场景:

WinForm使用POST请求方式向WebApi传递参数


关键词:dynamic
有时候我们抓到⼀段请求数据:JSON格式的字符串数据,我们就可能会⽤dynamic先接受数据,然后再转换成特定数据发出请求。

问题描述:

WinForm向WebApi中使用POST请求方式传参始终为空

WebApi中接收数据代码:
方式1:

[HttpPost]
public string Post(string value)
{
    JsonModel jsonModel = JsonConvert.DeserializeObject<JsonModel>(value);
    return value.ToJsonString();
}

方式2:

[HttpPost]
public string DataIn(JsonModel data)
{
    string value = "数据传入";
    string datain = JsonConvert.SerializeObject(data);
    return value + ": " + datain;
}

原因分析:

传入参数类型与接收参数类型不同,无法获取当前值
从WinForm使用POST向WebApi请求时,传递参数在接收端应使用动态类型(dynamic)接收


解决方案:

接收参数类型使用dynamic类型

[HttpPost]
public string Post(dynamic data)
{
    string value = data.ToString();
    JsonModel jsonModel = JsonConvert.DeserializeObject<JsonModel>(value);
    return value.ToJsonString();
}

完整案例:

———— WebApi ————

Student.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyWebAPI.Models
{
    public class Student
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }
}

Teacher.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyWebAPI.Models
{
    public class Teacher
    {
        public string Tname { get; set; }

        public int Tage { get; set; }
    }
}

JsonModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyWebAPI.Models
{
    public class JsonModel
    {
        public Student json1 { get; set; }
        public Teacher json2 { get; set; }
    }
}

WinFormCallController.cs

using MyWebAPI.Extensions;
using MyWebAPI.Models;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace MyWebAPI.Controllers
{
    public class WinFormCallController : ApiController
    {
    	//方法一 dynamic 
        [HttpPost]
        public string Post(dynamic data)
        {
            string value = data.ToString();
            JsonModel jsonModel = JsonConvert.DeserializeObject<JsonModel>(value);
            return value.ToJsonString();
        }
		//方法二 对象类型(json要规范化与WebApi中的实例要一致时json自动转化为实例)
        [HttpPost]
        public string DataIn(JsonModel data)
        {
            string value = "数据传入";
            string datain = JsonConvert.SerializeObject(data);
            return value + ": " + datain;
        }
    }
}

———— WinfFrom ————
Form1.cs

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WnFormApiTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        JsonModel js;
        //数据写入
        public void DataManage()
        {
            js = new JsonModel() { json1 = new Student(), json2 = new Teacher() };
            js.json1.Name = "Student";
            js.json1.Age = 11;
            js.json2.Tname = "Teacher";
            js.json2.Tage = 22;
        }

        private void Btn_Send_Click(object sender, EventArgs e)
        {
        	//string s = HttpPost("https://localhost:44311/api/WinFormCall?value=", "(写入要传入json字符串)");
            string s = HttpPost(txt_Url.Text, txt_SendMsg.Text);
            Student student = JsonConvert.DeserializeObject<Student>(s);
            int age = student.Age;
            string name = student.Name;
            txt_MesReturnMsg.Text = s;
        }

        public static string HttpPost(string url, string body)
        {
            Encoding encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.Accept = "text/html, application/xhtml+xml, */*";
            request.ContentType = "application/json";
            byte[] buffer = Encoding.UTF8.GetBytes(body);
            request.ContentLength = buffer.Length;
            Stream stream = request.GetRequestStream();
            stream.Write(buffer, 0, buffer.Length);
            //request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }

        public static string HttpGet(string url, string body)
        {
            Encoding encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.Accept = "text/html, application/xhtml+xml, */*";
            request.ContentType = "application/json";
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }

        private void btnSendGet_Click(object sender, EventArgs e)
        {
            string s = HttpGet(txt_Url.Text, txt_SendMsg.Text);
            txt_MesReturnMsg.Text = s;
        }

        private void btnClassSend_Click(object sender, EventArgs e)
        {
            DataManage();
            string json = JsonConvert.SerializeObject(js);//json序列化
            string s = HttpPost(txt_Url.Text, json);
            txt_MesReturnMsg.Text = s;
            MessageBox.Show("Model调用");
        }
    }
}

特别声明:ToJsonString需要自己定义方法。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Winform 是一种常见的 Windows 桌面应用程序开发平台,而 WebAPI 是一种基于 HTTP 的 Web 服务框架,两者可以很好地结合,实现桌面应用程序向 Web 服务发送请求获取数据的功能。 在 Winform 中调用 WebAPI 可以使用 .NET 的 HttpWebRequest 或 HttpClient 类,封装 HTTP 请求并发送给 Web 服务。在发送请求之前,需要先确定 WebAPI 的 URL 地址,以及请求所要传递的参数。可以使用 HttpClient 的 PostAsync 或 GetAsync 方法发送请求,接收 Web 服务返回的数据并处理。在接收WebAPI 的响应后,可以使用 JSON 序列化工具将数据反序列化为 .NET 对象,方便在 Winform 窗体中进行显示或进一步处理。 为了让 Winform 程序与 WebAPI 通信更加简便和高效,可以使用第三方的 RESTful API 框架,如 RestSharp 或 ServiceStack。这些框架可以帮助 Winform 应用程序快速、方便地与 WebAPI 进行通信,简化了操作流程,在 Winform 程序中使用起来更加便捷。 总之,Winform 调用 WebAPI 是一种常见且实用的开发方式,可以帮助开发人员快速获取 Web 服务数据或执行业务操作,提高应用程序的功能和效率。 ### 回答2: Winform 调用 Web API 是一个常见的操作,可以通过以下步骤实现。 首先,在 Winform 中添加 Web 请求的相关代码。通过 HttpClient 类,我们可以轻松地向 Web API 发送 HTTP 请求。下面是一个示例代码,用于在 Winform 中调用 Web API 中的一个方法: ``` HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:5000/"); HttpResponseMessage response = await client.GetAsync("api/values"); if (response.IsSuccessStatusCode) { string result = await response.Content.ReadAsStringAsync(); textBox1.Text = result; } else { textBox1.Text = "Error"; } ``` 在以上代码中,我们首先创建了一个 HttpClient 实例,并指定其 BaseAddress 属性为 Web API 的地址。然后,我们使用 GetAsync 方法向 Web API 发送请求,并等待响应。如果请求成功,我们将响应内容读取为字符串,并在 Winform 的文本框中显示。 在实际的开发中,我们还需要根据具体的需求和 Web API 的设计,设置请求头、请求参数等相关信息。 总的来说,Winform 调用 Web API 是一种方便、快捷、灵活的方法,可以有效地实现前后端分离,提高应用程序的易用性和可扩展性。 ### 回答3: Winform是一种桌面应用程序,它提供了丰富的用户界面和交互功能。WebAPI则是一种基于HTTP协议的状态无关的服务,它可以用来向任何客户端(包括Winform应用程序)提供数据或者执行某些操作。 要在Winform中调用WebAPI,需要使用HttpClient类来发送请求和接收响应。首先需要创建一个HttpClient实例,通过它可以发起各种类型的HTTP请求(如GET、POST、PUT、DELETE等)。同时还可以为每个请求设置必要的header和query参数,以及接收响应的格式(如JSON或XML)。 对于需要进行身份验证或者授权的请求,可以使用HttpClient的Credential属性来指定相应的用户名和密码。此外,还可以使用HttpClient的Timeout属性来设置超时时间,以避免请求过程中出现等待超时的问题。 在收到WebAPI的响应后,还需要对其进行解析和处理。HttpContent类提供了许多方法来获取返回的数据(如字符流、字节数组或者字符串)和解析JSON或XML格式的数据。可以将这些数据转换为相应的格式,然后在Winform应用程序中进行显示或其他操作。 总之,在Winform中调用WebAPI需要使用HttpClient类发起请求和接收响应,并使用HttpContent类对返回的数据进行解析和处理。这样可以实现Winform应用程序与WebAPI的通信,从而获取所需的数据或执行某些操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值