使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API

简介: 使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace BM.BLL.Utils
{
    public class SmsHelper
    {
        public static void SendSms()
        {
            string accessKeyId = "11111";
            string accessKeySecret = "1111";
            string phoneNumber = "1111";
            string signName = "11111";
            string templateCode = "SMS_295711502";
            string templateParam = "{\"code\":\"123456\"}";

            string domain = "dysmsapi.aliyuncs.com";
            string version = "2017-05-25";
            string action = "SendSms";
            string regionId = "cn-hangzhou";

            var parameters = new Dictionary<string, string>
            {
                { "AccessKeyId", accessKeyId },
                { "Action", "SendSms" },
                { "Format", "JSON" },
                { "PhoneNumbers", "13736969112" },
                { "RegionId", "cn-hangzhou" },
                { "SignName", "鹿城招生" },
                { "SignatureMethod", "HMAC-SHA1" },
                { "SignatureNonce", Guid.NewGuid().ToString() },
                { "SignatureVersion", "1.0" },
                { "TemplateCode", "SMS_295711502" },
                { "TemplateParam", "{\"code\":\"123456\"}" },
                { "Timestamp", DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss'Z'") },
                { "Version", "2017-05-25" }//2019-09-30   
            };

            string sortedQueryString = string.Join("&", parameters.Select(kvp => $"{kvp.Key}={SpecialUrlEncode(kvp.Value)}"));

            string stringToSign = $"GET&%2F&{SpecialUrlEncode(sortedQueryString)}";

            string signature = ComputeSignature(stringToSign, accessKeySecret + "&");

            string requestUrl = $"http://{domain}/?Signature={SpecialUrlEncode(signature)}&{sortedQueryString}";


            // 发送请求
            string response = SendRequest(requestUrl);

            Console.WriteLine("SMS sent, response: " + response);
        }

        public static string SpecialUrlEncode(string value)
        {
            string encodedValue = Uri.EscapeDataString(value);
            encodedValue = encodedValue.Replace("+", "%20").Replace("*", "%2A").Replace("%7E", "~");
            return encodedValue;
        }

        static string GetSortedQueryString(NameValueCollection values)
        {
            var sortedValues = values.AllKeys.Select(key => key + "=" + Uri.EscapeDataString(values[key]));
            return string.Join("&", sortedValues.OrderBy(s => s));
        }

        static string ComputeSignature(string stringToSign, string accessKeySecret)
        {
            using (var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(accessKeySecret)))
            {
                var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
                return Convert.ToBase64String(hashBytes);
            }
        }

        static string SendRequest(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";

            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                using (Stream responseStream = response.GetResponseStream())
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    return reader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("SMS sent, response: " + ex.Message);
            }
            return "";
        }

    }
}
目录
相关文章
|
26天前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
294 2
|
3月前
|
JavaScript 前端开发 API
Node.js中发起HTTP请求的五种方式
以上五种方式,尽管只是冰山一角,但已经足以让编写Node.js HTTP请求的你,在连接世界的舞台上演奏出华丽的乐章。从原生的 `http`到现代的 `fetch`,每种方式都有独特的风格和表现力,让你的代码随着项目的节奏自由地舞动。
394 65
|
2月前
|
Go 定位技术
Golang中设置HTTP请求代理的策略
在实际应用中,可能还需要处理代理服务器的连接稳定性、响应时间、以及错误处理等。因此,建议在使用代理时增加适当的错误重试机制,以确保网络请求的健壮性。此外,由于网络编程涉及的细节较多,彻底测试以确认代理配置符合预期的行为也是十分重要的。
119 8
|
1月前
|
JSON JavaScript API
Python模拟HTTP请求实现APP自动签到
Python模拟HTTP请求实现APP自动签到
|
2月前
|
缓存
|
1月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
2月前
|
缓存 JavaScript 前端开发
Vue 3 HTTP请求封装导致响应结果无法在浏览器中获取,尽管实际请求已成功。
通过逐项检查和调试,最终可以定位问题所在,修复后便能正常在浏览器中获取响应结果。
154 0
|
2月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
207 0
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
3月前
|
自然语言处理 算法 API
阿里云增值税发票识别NET Rest API调用示例
本文介绍了使用NET代码调用阿里云增值税发票识别API的实现方式。通过示例代码,详细展示了如何构造请求、设置签名以及发送HTTP请求的具体步骤。代码中涵盖了请求参数的处理、签名生成逻辑(如HMAC-SHA256算法)以及调用API后的结果处理。此外,还提供了运行结果的截图和参考文档链接,帮助开发者更好地理解和应用该接口。
205 4