C#发起Http请求,调用接口
//方法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请求,调用接口的更多相关文章
- java通过java.net.URL发送http请求调用接口
一般在*.html,*.jsp页面中我们通过使用ajax调用接口,这个是我们通常用的.对于这些接口,大都是本公司写的接口供自己调用,所以直接用ajax就可以.但是,如果是多家公司共同开发一个东西,一个 ...
- 利用jmeter发起java请求调用shell脚本
1.创建maven项目 在pom文件中加入依赖: 2.在路径src/main/java下创建类,如类名shellclass 3. 创建jmet ...
- php 用post请求调用接口api
$post_data=""; $ch = curl_init(); $url = ''; curl_setopt($ch , CURLOPT_URL , $url); curl_s ...
- HttpURLConnection 当作请求调用接口不带返回参数的工具类
package cn.smartercampus.core.util; import java.io.BufferedReader; import java.io.InputStream; impor ...
- java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)
第一步: 1.为项目配置 Tomcat 为 server: 2.导入 mysql的jar包 到项目目录中: 第二步:编码 1.数据库连接类ConnectMysql.java代码: package co ...
- java编程(1)——servlet和Ajax异步请求的接口编程(没有调用数据库的数据)
编程应用背景: 使用HttpServlet接口来编写一个动态登录的接口(需要在Tomcat容器发布) 登录的 LoginSample 类代码: package com.zhang.java; publ ...
- ajax跨域请求调用webservice接口
1.WebService 接口编写 步骤:新建web项目=>添加web service=>编写方法接口=>然后发布(本地测试可以直接把这个web service运行起来). 关键如何 ...
- app接口,如何保证是由app内部调用而非外部模拟post请求调用。
在爬虫快手主播信息的时候,发现只要我改动一下参数,比如第一页 page=1的时候,需要爬下一页,把page改为2发现提示sign验证失败了 也就是说,快手在开发的时候考虑了有人抓包到接口后,通过修改参 ...
- 跨域调用接口——WebClient通过get和post请求api
AJAX不可以实现跨域请求,经过特殊处理才行.一般后台可以通过WebClient实现跨域请求~ //get 请求 string url = string.Format("htt ...
随机推荐
- mysql replace into 实现存在则更新,不存在则插入
测试用的mysql数据库: 新建测试表: CREATE TABLE `test` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `text` varchar(2 ...
- Jenkins+Docker+Git+Harbor流水线打包
Jenkins+Docker+Git+Harbor流水线打包 环境: CentOS Linux release 7.6.1810 (Core) 192.168.247.214 Jenkins+dock ...
- Netlink: 内核与用户空间传输数据的socket协议
https://en.wikipedia.org/wiki/Netlink https://stackoverflow.com/questions/12899055/how-kernel-notify ...
- keepalived日志显示脚本能执行成功,但是amoeba程序没启动起来,单独执行脚本amoeba能启动成功,放到keepalived里面启动不起来
keepalived日志如图: 解决:keepalived还有crontab等计划任务自动执行脚本,并不会有本地用户的环境变量,需要在脚本里面加 . /etc/profile 引入本地用户的环境变量
- C++学习(2)—— 数据类型
C++规定在创建一个变量或者常量的时候,必须指定出相应的数据类型,否则无法给变量分配内存 数据类型存在意义:给变量分配合适的内存空间 1. 整型 作用:整型变量表示的是整数类型的数据 C++中能够表示 ...
- 用IntelliJ IDEA学习Spring--创建一个简单的项目
这段时间想学习一下Spring,其实之前学过Spring,只是有些忘记了.而且之前学的时候是适用eclipse学习的,现在好像对IntelliJ这个工具使用挺多的,现在就学习一下这个工具的用法,顺便复 ...
- 删除线性表中所有值为x的元素
时间复杂度O(n),空间复杂度O(1). 简单的问题两种不同的思路. 代码: #include <stdio.h> #define MAX 100 struct sqlist{ int d ...
- 编程小白入门分享三:Spring AOP统一异常处理
Spring AOP统一异常处理 简介 在Controller层,Service层,可能会有很多的try catch代码块.这将会严重影响代码的可读性."美观性".怎样才可以把更多 ...
- LeetCode(数据库)部门最高工资
), Salary int, DepartmentId int) )) Truncate table Employee ') ') ') ') Truncate table Department ', ...
- 使用window.localStorage,window.localStorage记录点击次数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...