Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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# 无法重新创建从Postman到C的REST API调用#_C#_Api_Rest_Postman - Fatal编程技术网

C# 无法重新创建从Postman到C的REST API调用#

C# 无法重新创建从Postman到C的REST API调用#,c#,api,rest,postman,C#,Api,Rest,Postman,我正在尝试向API发出POST请求,并在Postman中成功地完成了这一操作。 现在,因为Postman提供了代码片段,我可以将其复制粘贴到C#应用程序中,得到完全相同的结果 问题是:身份验证过期了。 如果我调用Postman,将nonce、signature和timestamp值复制到我的应用程序中,并以这种方式使用,它可以正常工作几分钟。最终,它将过期,并且调用不起作用,它将返回0005。因此,我必须在我的应用程序中自己生成签名、nonce和时间戳值 我已经花了这么多时间试着这么做,但我不明

我正在尝试向API发出POST请求,并在Postman中成功地完成了这一操作。 现在,因为Postman提供了代码片段,我可以将其复制粘贴到C#应用程序中,得到完全相同的结果

问题是:身份验证过期了。 如果我调用Postman,将nonce、signature和timestamp值复制到我的应用程序中,并以这种方式使用,它可以正常工作几分钟。最终,它将过期,并且调用不起作用,它将返回0005。因此,我必须在我的应用程序中自己生成签名、nonce和时间戳值

我已经花了这么多时间试着这么做,但我不明白为什么它不起作用。我尝试了几种方法,但似乎让我走得最远的方法是:

以下代码由邮递员在成功拨打电话(使用RestSharp)后给出:

然后,我使用以下命令获取签名字符串的Base64

public static string GetSignatureBaseString(string TimeStamp, string Nonce)
{
    //1.Convert the HTTP Method to uppercase and set the output string equal to this value.
    string Signature_Base_String = "Get";
    Signature_Base_String = Signature_Base_String.ToUpper();

    //2.Append the ‘&’ character to the output string.
    Signature_Base_String = Signature_Base_String + "&";

    //3.Percent encode the URL and append it to the output string.
    string PercentEncodedURL = Uri.EscapeDataString(GetAppleApiUrl.GetUrl(AppleApiUrl.SESSION_TOKEN));
    Signature_Base_String = Signature_Base_String + PercentEncodedURL;

    //4.Append the ‘&’ character to the output string.
    Signature_Base_String = Signature_Base_String + "&";

    //5.append parameter string to the output string.
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("oauth_consumer_key=" + Settings.SettingsManager.consumer_key);
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_token=" + Settings.SettingsManager.access_token);
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_signature_method=" +"HMAC-SHA1");
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_timestamp=" + TimeStamp);
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_nonce=" + Nonce);
    Signature_Base_String = Signature_Base_String + Uri.EscapeDataString("&oauth_version=" + "1.0");

    return Signature_Base_String;
}
最后,获取sha1散列

public static string GetSha1Hash(string key, string message)
{
    var encoding = new System.Text.ASCIIEncoding();

    byte[] keyBytes = encoding.GetBytes(key);
    byte[] messageBytes = encoding.GetBytes(message);

    string Sha1Result = string.Empty;

    using (HMACSHA1 SHA1 = new HMACSHA1(keyBytes))
    {
        var Hashed = SHA1.ComputeHash(messageBytes);
        Sha1Result = Convert.ToBase64String(Hashed);
    }

    return Sha1Result;
}
它输出并发送到服务器的OAuth 1.0字符串如下所示:

OAuth oauth_consumer_key="c3e75004bbfxxxxxxx5f0104",oauth_token="e90xxxxxx38046158d3",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1605588743",oauth_nonce="MTYwNTU4ODc0Mw%3D%3D",oauth_version="1.0",oauth_signature="4jKad%2xxxxxxSV%xxxxxxxxxxxMP%2FI%3D"
我结合这两个函数的方法是用字符串格式{0}{1}{2}等替换成功的邮递员调用中的键,并使用两个函数生成的值:key&access token很好,timestamp我从当前时间obv获得,nonce是timestamp的base64,然后签名是funct1使用secret和tokensecret对base64签名的哈希

这看起来很像邮递员(除了他们的nonce和我的相比总是很短,但我认为这与问题无关)

谁能看出我做错了什么

编辑:额外代码

我使用上述各项的方式:

var timeStamp = (System.Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds)).ToString();
var nonce = Convert.ToBase64String(Encoding.UTF8.GetBytes(timeStamp)).ToString();
SortedDictionary<string, string> @params = new SortedDictionary<string, string>();
@params.Add("application/json", "{" + Constants.vbCrLf + "    \"start\": {\"from\": 1604542428000, \"to\": 1605147228000}," + Constants.vbCrLf + "    \"status\": [\"CLOSE\"]" + Constants.vbCrLf + "}" + Constants.vbCrLf);
string b64sig = GetSignatureBaseString(timeStamp, nonce);
string signature = GetSha1Hash("secret-key", b64sig);
var timeStamp=(System.Convert.ToInt32((DateTime.UtcNow-newdatetime(1970,1,1)).TotalSeconds)).ToString();
var nonce=Convert.ToBase64String(Encoding.UTF8.GetBytes(timeStamp)).ToString();
SortedDictionary@params=新的SortedDictionary();
@params.Add(“application/json”,“{+Constants.vbCrLf+”\“start\”:{“from\”:16045428000,\“to\”:1605147228000},“+Constants.vbCrLf+”\“status\”:[“CLOSE\”]“+Constants.vbCrLf+”}+Constants.vbCrLf+”+)+Constants.vbCrLf);
字符串b64sig=getSignatureBasString(时间戳,nonce);
字符串签名=GetSha1Hash(“密钥”,b64sig);

然后我将所有的值插入OAuth字符串并发出请求。它返回0005身份验证错误。关于身体参数,我需要这些来得到回应。如果我只使用邮递员的nonce、时间戳和签名,这就可以了,所以我相信这与问题无关。我不需要包含body参数来生成签名,对吗?

您可以共享生成时间戳和nonce的代码吗?还有,您是如何从SingagutureBaseString生成签名的?@ChetanRanpariya嗨,谢谢您的回复。我使用以下命令生成时间戳:var timestamp=(System.Convert.ToInt32((DateTime.UtcNow-new DateTime(1970,1,1)).TotalSeconds)).ToString()@ChetanRanpariya签名是通过使用密钥转义signature64basestring上的GetSha1Hash结果生成的。EscapeDataString(GetSha1Hash(“密钥”,b64sig))。这是一个混乱的评论,所以我会把它全部添加到OP。您生成签名基字符串的方式是不正确的。。。您可以参考twitter上的文档了解如何生成基本字符串。一旦生成了正确的签名基础,如果您拥有令牌机密或仅使用客户端机密生成签名,则需要同时使用clientsecret和tokensecret生成签名。。
var timeStamp = (System.Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds)).ToString();
var nonce = Convert.ToBase64String(Encoding.UTF8.GetBytes(timeStamp)).ToString();
SortedDictionary<string, string> @params = new SortedDictionary<string, string>();
@params.Add("application/json", "{" + Constants.vbCrLf + "    \"start\": {\"from\": 1604542428000, \"to\": 1605147228000}," + Constants.vbCrLf + "    \"status\": [\"CLOSE\"]" + Constants.vbCrLf + "}" + Constants.vbCrLf);
string b64sig = GetSignatureBaseString(timeStamp, nonce);
string signature = GetSha1Hash("secret-key", b64sig);