首页 > 解决方案 > 在 C# 中向 REST API 调用 (OAuth 1.0) 添加参数会导致 Signature_Invalid (401) 错误

问题描述

我正在尝试从 BrickLink API 获得未完成的订单。我可以连接并授权我的连接,然后返回大量订单。但是,当我尝试向调用添加任何参数时,它会返回 Signature_invalid 错误。

private static string GetOrderList() {
    // Build the URL.
    var url = urltocall + "/" + actionrequest;

    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.Method = "GET";
    CreateNonce();    // Prepare the nonce.

    // Build the URL and add the oAuth to it.
    var signatureBaseString = Escape(httpWebRequest.Method.ToUpper()) + "&";
        signatureBaseString += EscapeUriDataStringRfc3986(url.ToLower()) + "&";
        signatureBaseString += EscapeUriDataStringRfc3986(CreateoAuth());
            /// CreateoAuth generates the oAuth to connect to Bricklink
        CreateSignatureString(signatureBaseString);
        var header = CreateHeaderString();    // Sets up the SHTTP header.

        // Prepare the URL call and get the results from it.
        httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, header);
        var response = httpWebRequest.GetResponse();
        var characterSet = ((HttpWebResponse)response).CharacterSet;
        var responseEncoding = characterSet == ""
            ? Encoding.UTF8
            : Encoding.GetEncoding(characterSet ?? "utf-8");
        var responsestream = response.GetResponseStream();

        if (responsestream == null)
        {
            throw new ArgumentNullException(nameof(characterSet));
        }
        using (responsestream)
        {
            var reader = new StreamReader(responsestream, responseEncoding);
            var result = reader.ReadToEnd();

            Console.WriteLine(@"result: " + result);
            return result;
        }
    }

如果运行上面的代码(显然类中有一些私有方法来准备 oAuth 和 URL 等),我们得到了大量的订单返回,这很好。

根据 API 文档 ( http://apidev.bricklink.com/redmine/projects/bricklink-api/wiki/OrderMethod#Get-Orders ),我们可以向 URL 添加参数以限制返回的记录。我在 url 定义之后添加以下行以添加参数。

//      url =+ "?status=PENDING";

当我这样做时,我得到以下响应:

result: {"meta":{"description":"SIGNATURE_INVALID: Invalid Signature","message":"BAD_OAUTH_REQUEST","code":401}}

如何将参数传递给 API,使其不会破坏 oAuth?

标签: c#apioauthhttp-status-code-401query-parameters

解决方案


推荐阅读