//方法1. Post 异步请求,普通的异步请求,传输普通的字符串等,对于有html代码的字段值的传输支持不好,如果需要传输html,二进制等数据的传输,请使用下面第二个方法,即使用UploadDataAsync

using (var client = new WebClient())
{
var paramJson = ObjectToJson(emailModel);
client.Headers[HttpRequestHeader.ContentType] = "application/json";
cli.UploadStringAsync(new Uri(url), paramJson);
}

//方法2. Post 异步请求,emailModel实体可包含byte[]的字段值

下面传入的json就包含byte[]的字段序列化成json的,但注意一点,如果用Newtonsoft序列化byte[]的字段,序列化后的json是经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC(瞎写的,示例而已)这样的字段串,

这样序列后的json传入这个方法后byte[]字段的值会丢失,我们需要的其实是把比如byte[] files=[22,45,67,67,89,54,21]这个字段的值,序列化后得到[22,45,67,67,89,54,21]这个字符串,

而不想得到经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC的字符串,这时可以使用.net原装的JavascriptSerialize.Serialize(model)来达到这种效果,这点需要特别注意下,, 暂时没有找到Newtonsoft序列化byte[]为byte[]字符串的解决办法。

using (var client = new WebClient())
{
var paramJson = ObjectToJson(emailModel);
client.Headers[HttpRequestHeader.ContentType] = "application/json";
var bytes = Encoding.UTF8.GetBytes(paramJson);
client.UploadDataAsync(new Uri(url), "POST", bytes);
}

public static string ObjectToJson(object obj)
{
JavaScriptSerializer jsonSerialize = new JavaScriptSerializer();
return jsonSerialize.Serialize(obj);
}

方法3. 使用RestSharp第三方库dll发起Http请求,emailModel实体可包含byte[]的字段值,Rest会自动处理传输数据,进行序列化

var model = new { Name = "NotifyAdminPlaceOrder", Subject = "<%CompanyName%> Cash Exercise行权管理", Body = emailModel.Parameters["@Content"] };
string url2 = "https://localhost:44300/system/GenerateMailTemplate";
var request = new RestRequest();
request.RequestFormat = DataFormat.Json;
request.AddBody(model);
var restClient = new RestClient(url2);
restClient.PostAsync(request, null);

方法4. 比较老的发起Web请求的方法,虽然代码陈旧但宝刀未老,是功能比较全面的选项之一。

下面传入的json就包含byte[]的字段序列化成json的,但注意一点,如果用Newtonsoft序列化byte[]的字段,序列化后的json是经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC(瞎写的,示例而已)这样的字段串,

这样序列后的json传入这个方法后byte[]字段的值会丢失,我们需要的其实是把比如byte[] files=[22,45,67,67,89,54,21]这个字段的值,序列化后得到[22,45,67,67,89,54,21]这个字符串,

而不想得到经过BaseString64编码后面的类似于AUUUAABWWWBBCCCC的字符串,这时可以使用.net原装的JavascriptSerialize.Serialize(model)来达到这种效果,这点需要特别注意下, 暂时没有找到Newtonsoft序列化byte[]为byte[]字符串的解决办法。

/// <summary>
/// 创建JSON请求
/// </summary>
/// <param name="url">请求的URL</param>
/// <param name="json">请求中包含的JSON字符串参数</param>
/// <param name="userAgent">请求的客户端浏览器信息,可以为空,或使用TC.Core.Web.BrowserUserAgent类获取</param>
/// <param name="requestEncoding">请求编码</param>
/// <returns></returns>
public static HttpWebResponse CreateJSONReponse(string url, string json, string userAgent = "", Encoding requestEncoding = null)
{
if (requestEncoding == null)
requestEncoding = Encoding.UTF8;

var data = requestEncoding.GetBytes(json);
var uri = new Uri(url);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

//此处为C#实现的一些标准http请求头添加方法,用上面的方面也可以实现
request.ContentType = "application/json";
request.Accept = "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml";
request.ContentLength = data.Length;
request.UserAgent = string.IsNullOrEmpty(userAgent) ? "TC.Framework.MessageHandling" : userAgent;
//此处添加标准http请求方面
request.Method = "POST";

System.IO.Stream sm = request.GetRequestStream();
sm.Write(data, 0, data.Length);
sm.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
return response;
}

C#发起Http请求,调用接口的更多相关文章

  1. java通过java.net.URL发送http请求调用接口

    一般在*.html,*.jsp页面中我们通过使用ajax调用接口,这个是我们通常用的.对于这些接口,大都是本公司写的接口供自己调用,所以直接用ajax就可以.但是,如果是多家公司共同开发一个东西,一个 ...

  2. 利用jmeter发起java请求调用shell脚本

    1.创建maven项目 在pom文件中加入依赖:     2.在路径src/main/java下创建类,如类名shellclass                     3.      创建jmet ...

  3. php 用post请求调用接口api

    $post_data=""; $ch = curl_init(); $url = ''; curl_setopt($ch , CURLOPT_URL , $url); curl_s ...

  4. HttpURLConnection 当作请求调用接口不带返回参数的工具类

    package cn.smartercampus.core.util; import java.io.BufferedReader; import java.io.InputStream; impor ...

  5. java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)

    第一步: 1.为项目配置 Tomcat 为 server: 2.导入 mysql的jar包 到项目目录中: 第二步:编码 1.数据库连接类ConnectMysql.java代码: package co ...

  6. java编程(1)——servlet和Ajax异步请求的接口编程(没有调用数据库的数据)

    编程应用背景: 使用HttpServlet接口来编写一个动态登录的接口(需要在Tomcat容器发布) 登录的 LoginSample 类代码: package com.zhang.java; publ ...

  7. ajax跨域请求调用webservice接口

    1.WebService 接口编写 步骤:新建web项目=>添加web service=>编写方法接口=>然后发布(本地测试可以直接把这个web service运行起来). 关键如何 ...

  8. app接口,如何保证是由app内部调用而非外部模拟post请求调用。

    在爬虫快手主播信息的时候,发现只要我改动一下参数,比如第一页 page=1的时候,需要爬下一页,把page改为2发现提示sign验证失败了 也就是说,快手在开发的时候考虑了有人抓包到接口后,通过修改参 ...

  9. 跨域调用接口——WebClient通过get和post请求api

    AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求        string url = string.Format("htt ...

随机推荐

  1. SQL LISTAGG 合并行

    LISTAGG  Syntax 语法 listagg_overflow_clause::= Purpose For a specified measure, LISTAGG orders data w ...

  2. Ubuntu安装32位程序兼容包

    有的交叉编译工具链是32位的,经常会遇到安装完成之后提示好不到,这时候需要安装32位兼容程序,使用以下命令安装: sudo apt-get update sudo apt install gcc-mu ...

  3. ELK Stack部署

    部署ELK Stack 官网:https://www.elastic.co 环境准备: ip hostname 服务 用户.组 192.168.20.3 node2003 kibana6.5,file ...

  4. stm32flash的读写特性

    在使用stm32自带的flash保存数据时候,如下特点必须知道: 1.必须是先擦除一个扇区,才能写入 2.读数据没有限制 3.写数据必须是2字节,同时写入地址以一定要考虑字节对齐, 4.一般都是在最后 ...

  5. EFK架构图

    Environment:{ 三台CentOS7操作系统 (环境均安装jdk) } 需要机器: 消息中间件的机器中  kafka 和 zookeeper 同时安装在三台虚拟机 logstash  960 ...

  6. java实现ssh登录linux服务器并下发命令

    依赖jar包:jsch-0.1.55.jar   commons-io-2.5.jar import com.jcraft.jsch.ChannelExec; import com.jcraft.js ...

  7. windbg命令行选项

    我们不仅可以通过GUI的方式使用Windbg,还可以通过命令行的方式使用它,且在有些需求和使用场景下,只能使用命令行模式  windbg命令行使用以下语法: windbg [ -server Serv ...

  8. .NET Core入门程序及命令行练习

    用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运行机制. 准备工作 安装.NET Core 运行环境,下载地址 ...

  9. circus && web comsole docker-compose 独立部署

    问题的根本原因是web console 的bug(实际上还是python 对于依赖版本出来不明确) circus 进程docker 镜像 dockerfile FROM python:slim-str ...

  10. windows 获取时间戳

    Windows 批处理时间戳 1.时间戳格式: 取年份: echo %date:~,% 取月份: echo %date:~,% 取日期: echo %date:~,% 取星期: echo %date: ...