• The remote server returned an error: (404) Not Found.


    近段时间经常对接一些接口,也遇到了一些问题。今天抽时间做个记录,也同时分享一下经验

    1.request请求对方的API,

        需要有TOKEN认证,认证的方式是在请求头中加入

        Content-Signature:"HMAC-SHA1 SDFASDFS"

      这个里面有加密算法,HMAC-SHA1的算法大家去网上查吧,比如JAVA,PHP很多。

    我这里分享一个C#的:

         

     1       /// <summary>
     2       /// 加密算法
     3       /// </summary>
     4       /// <param name="text"></param>
     5       /// <param name="key"></param>
     6       /// <returns></returns>
     7       public static string HmacSha1Sign(string str, string key = "")
     8       {
     9           if (key == "")
    10           {
    11               key = apiSecret;
    12           }          
    13           byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(key);
    14           HMACSHA1 hmac = new HMACSHA1(keyBytes);
    15           byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(str);        
    16           byte[] signByte = hmac.ComputeHash(inputBytes);
    17           return  Convert.ToBase64String(signByte);
    18       }

    这个算是经过验证完全可以使用。

    2.请求API

       认证的加密有了开始进行请求:https 请求时就坑了一直在报404,

        The remote server returned an error: (404) Not Found.  

       最后下班回家~~~~

       第二天接着来,my god ~~~~

        The remote server returned an error: (404) Not Found.  

       后来就开始各种怀疑,最后经过删除代码,然后在加上的方式不停的测试后来发现

       header 中有一个参数:UserAgent  

      把这个注掉,可以了。我滴神~~~~

     下面看一下什么是:  Http Header之User-Agent

        User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的 UA来判断的。UA可以进行伪装。

        浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同

      最后重新整理了一下请求头结果一切正常了!!!

       最后分享一下C#请求方法:

      1   /// <summary>  
      2         /// 创建POST方式的HTTP请求  
      3         /// </summary>  
      4         /// <param name="url">请求的URL</param>  
      5         /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>  
      6         /// <param name="timeout">请求的超时时间</param>  
      7         /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
      8         /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>  
      9         /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
     10         /// <returns></returns>  
     11         public HttpWebResponse CreatePostHttpResponse(string url, string parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null,bool endcode=true)
     12         {
     13             if (Debug)
     14             {
     15                 Console.Write("Start Post Url:{0} ,parameters:{1}  ", url, parameters);
     16 
     17 
     18             }
     19 
     20             if (string.IsNullOrEmpty(url))
     21             {
     22                 throw new ArgumentNullException("url");
     23             }
     24             if (requestEncoding == null)
     25             {
     26                 throw new ArgumentNullException("requestEncoding");
     27             }
     28             HttpWebRequest request = null;
     29             //如果是发送HTTPS请求  
     30             if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
     31             {
     32                 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
     33                 request = WebRequest.Create(url) as HttpWebRequest;
     34                 request.ProtocolVersion = HttpVersion.Version10;
     35             }
     36             else
     37             {
     38                 request = WebRequest.Create(url) as HttpWebRequest;
     39             }
     40 
     41             request.Method = "POST";
     42             //request.Host = "127.0.0.1";
     43              request.Headers.Add("Accept-Language", "zh-CN,en-GB;q=0.5");
     44              request.Method = "POST";
     45              request.Accept = "application/json;text/html;application/xhtml+xml;*/*; charset=utf-8";
     46             request.Referer = Referer;
     47             request.ContentType = "application/json;charset=" + Encoding.UTF8.WebName;
     48             request.Headers["Pragma"] = "no-cache";
     49 
     50             if (cookies != null)
     51             {
     52                 request.CookieContainer = new CookieContainer();
     53                 request.CookieContainer.Add(cookies);
     54             }
     55             else
     56             {
     57                 request.CookieContainer = new CookieContainer();
     58                 request.CookieContainer.Add(Cookies);
     59             }
     60 
     61             if (headers != null)
     62             {
     63                 foreach (var header in headers)
     64                 {
     65                     request.Headers.Add(header.Key, header.Value);
     66                 }
     67             }
     68 
     69             //开启后会卡关请求是允许浏览器访问
     70             if (!string.IsNullOrEmpty(userAgent))
     71             {
     72                 request.UserAgent = userAgent;
     73             }
     74             //else
     75             //{
     76             //    request.UserAgent = DefaultUserAgent;
     77             //}
     78 
     79             if (timeout.HasValue)
     80             {
     81                 request.Timeout = timeout.Value * 1000;
     82             }
     83 
     84             //request.Expect = string.Empty;
     85 
     86             //如果需要POST数据  
     87             if (!string.IsNullOrEmpty(parameters))
     88             {
     89              
     90                 var tempParam = "";
     91                 if (endcode)
     92                 {
     93                      tempParam = ConvertEnCode.ConvertToEncode(parameters);
     94                 }
     95                 else
     96                 {
     97                       tempParam =parameters;
     98                   
     99                 }
    100                 
    101 
    102                 byte[] data = requestEncoding.GetBytes(tempParam);
    103                 using (Stream stream = request.GetRequestStream())
    104                 {
    105                     stream.Write(data, 0, data.Length);
    106                 }
    107             }
    108 
    109             var v = request.GetResponse() as HttpWebResponse;
    110 
    111             Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
    112             Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
    113             Cookies.Add(v.Cookies);
    114 
    115             if (Debug)
    116             {
    117                 Console.WriteLine("OK");
    118             }
    119           return v;
    120         }












     最后再补充说明一个400,404现象:  X509Certificate2

       var privateKey =new X509Certificate2("xxxxxxx.pfx", "pwdxxxxxxxx",X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey asRSACryptoServiceProvider;

      如果有用到这个加密算法时,注意GHOST版本的系统是不行的。一定要找个正版系统或者是纯安装版的系统才可以。

     原因目前不清楚~~~~

  • 相关阅读:
    ES6常用语法简介
    webpack核心概念
    前端模块化规范详解
    使用Node.js原生代码实现静态服务器
    Node.js脚手架express与前段通信【socket】
    临门一脚- Node.js
    redis缓存穿透和雪崩
    redis哨兵模式
    redis主从复制
    redis发布订阅
  • 原文地址:https://www.cnblogs.com/keim/p/7665803.html
Copyright © 2020-2023  润新知