Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 苹果新闻API中的POST请求_C#_Post_Apple News - Fatal编程技术网

C# 苹果新闻API中的POST请求

C# 苹果新闻API中的POST请求,c#,post,apple-news,C#,Post,Apple News,我正在为写一篇文章而苦苦挣扎 有人能给我提供一个C#中规范请求的示例值吗? 我收到的错误是签名问题: {"errors":[{"code":"WRONG_SIGNATURE"}]} 据我所知,规范化请求的构建来自: Method = POST URL = https://news-api.apple.com/channels/ChanelID/articles Date = 2019-07-24T18:12:32Z Content-Type = multipart/form-data Body

我正在为写一篇文章而苦苦挣扎

有人能给我提供一个C#中规范请求的示例值吗?

我收到的错误是签名问题:

{"errors":[{"code":"WRONG_SIGNATURE"}]}
据我所知,规范化请求的构建来自:

Method = POST
URL = https://news-api.apple.com/channels/ChanelID/articles
Date = 2019-07-24T18:12:32Z
Content-Type = multipart/form-data
Body - Not fully understood
苹果新闻API文档说

如果请求是POST请求且包含实体,则包括 以下是:

内容类型标头的值

实体的全部内容-这是什么意思?

我想发布一篇来自苹果文档中提供的json文件的测试文章

这是生成auth标头的类:

public class Security
{
  public static string AuthHeader(string method, string url, object content=null)
  {
        string formDataBoundary = String.Format("{0:N}", Guid.NewGuid());
        var apiKeyId = Constants.AppleNewsKeyId;
        var apiKeySecret = Constants.AppleNewsKeySecret;
        if (string.IsNullOrEmpty(apiKeyId) || string.IsNullOrEmpty(apiKeySecret)) return string.Empty;
        var encoding = new ASCIIEncoding();
        var dt = DateTime.Now.ToString(Constants.DateFormat);
        var canonicalRequest = string.Format("{0}{1}{2}{3}", method, url, dt, content);
        var key = Convert.FromBase64String(apiKeySecret);
        var hmac = new HMACSHA256(key);
        var hashed = hmac.ComputeHash(encoding.GetBytes(canonicalRequest));
        var signature = Convert.ToBase64String(hashed);
        var authorizaton = string.Format(@"HHMAC; key={0}; signature={1}; date={2}", apiKeyId, signature, dt);
        return authorizaton;
    }
}
这是常量类:

public static class Constants
{
    public static readonly string ChannelId = "myID"; 
    public static readonly string AppleNewsBaseUri = "https://news-api.apple.com";
    public static readonly string DateFormat = "yyyy-MM-ddTHH:mm:ssK";
    public static readonly string AppleNewsKeySecret = "myID";
    public static readonly string AppleNewsKeyId = "myID";   
}
以及缺少代码的action类,以便将适当的内容(而不是null)传递给AuthHeader方法:

 public class Action
    {
        public static string SendCommand(string action, string method)
        {
         var url = $"{Constants.AppleNewsBaseUri}{action}" + "/articles";
        //string content = String.Format("{0}:{1}", "Content-Disposition", "form-data; filename=article.json; name=article.json;");
        var authheader = Security.AuthHeader(method, url, null);
        var request = WebRequest.Create(url);
        request.PreAuthenticate = true;
        request.Method = "POST";
        request.Headers.Add("Authorization", authheader);

        if (method.Equals("post", StringComparison.InvariantCultureIgnoreCase))
            request.ContentType = "multipart/form-data;" ;
        var output = string.Empty;
        try
        {
            string filePath = Path.GetFullPath("article.json");
            using (StreamReader r = new StreamReader(filePath))
            {
                string json = r.ReadToEnd();
                dynamic jsonObj = JsonConvert.DeserializeObject(json);

                ASCIIEncoding encoding = new ASCIIEncoding();
                Byte[] bytes = encoding.GetBytes(json);
                request.ContentLength = bytes.Length;

                Stream newStream = request.GetRequestStream();
                newStream.Write(bytes, 0, bytes.Length);
                newStream.Close();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("The file could not be read:");
            Console.WriteLine(e.Message);
        }

        try
        {
            using (var response = request.GetResponse())
            {
                using (var reader = new StreamReader(response.GetResponseStream()))
                    output = reader.ReadToEnd();
            }
        }
        catch (WebException e)
        {
            using (var reader = new StreamReader(e.Response.GetResponseStream()))
            {
                output = reader.ReadToEnd();
            }
        }
        return output;
    }


    public static string ReadChannel()
    {
        var action = $"/channels/{Constants.ChannelId}";
        const string method = "POST";
        return SendCommand(action, method);
    }
}