REST 请求适用于 POSTMAN,但不适用于 RestClient



我想使用 REST API 从我的 magento 网站下载订单。

我为我的网站使用了https,所以当你请求http时,它会自动转换为https。

我的 REST 请求非常简单,只需在 http 请求标头中包含令牌,该请求在 POSTMAN 中工作正常,但使用我的 c# 代码,它始终失败。

我的 RestClient 库:

 public class RestClient
 {
    public string EndPoint { get; set; }
    public HttpVerb Method { get; set; }
    public string ContentType { get; set; }
    public string PostData { get; set; }
    public string Accept { get; set; }
    public RestClient(string endpoint, HttpVerb method, string postData, string contentType)
    {
        EndPoint = endpoint;
        Method = method;
        ContentType = contentType;
        PostData = postData;
    }
      public string MakeRequest(string parameters, Dictionary<string, string> headers, 
        out HttpStatusCode httpStatusCode, out bool succeed)
     {
        httpStatusCode = HttpStatusCode.NotFound;
        succeed = false;
        var request = (HttpWebRequest)WebRequest.Create(EndPoint + parameters);
        request.Method = Method.ToString();
        //request.ContentLength = 0;
        request.ContentType = ContentType;
        if (Accept!=null && Accept != "")
            request.Accept = Accept;
        foreach (var entry in headers)
        {
            request.Headers[entry.Key] = entry.Value;
        }
        if (!string.IsNullOrEmpty(PostData) && (Method == HttpVerb.POST || Method == HttpVerb.PUT))
        {
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                streamWriter.Write(PostData);
            }
        }
        try
        {
            using (var response = (HttpWebResponse)request.GetResponse())
            {
                var responseValue = string.Empty;
                httpStatusCode = response.StatusCode;
                // grab the response
                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (var reader = new StreamReader(responseStream))
                        {
                            responseValue = reader.ReadToEnd();
                        }
                    }
                }
                succeed = true;
                return responseValue;
            }
        }
        catch (WebException ex)
        {
            var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
            return resp;
        }
        return "";
    }

我的代码:

        Dictionary<string, string> headers = new Dictionary<string, string>();
        headers.Add("Authorization", String.Format("Bearer {0}", credential.Token));
        String url = String.Format("{0}/rest/V1/orders?"
            +"searchCriteria[filter_groups][0][filters][0][field]=updated_at&"
            +"searchCriteria[filter_groups][0][filters][0][value]={1}&"
            +"searchCriteria[filter_groups][0][filters][0][condition_type]=from&"
            +"searchCriteria[filter_groups][1][filters][0][field]=updated_at&"
            +"searchCriteria[filter_groups][1][filters][0][value]={2}&"
            +"searchCriteria[filter_groups][1][filters][0][condition_type]=to",
            credential.WebsiteURL,
            updateStart.ToString(),
            updateEnd.ToString());
        RestClient client = new RestClient(url, HttpVerb.GET, "", "application/json");
        String respJson = null;
        HttpStatusCode code = HttpStatusCode.NotFound;
        bool succeed = false;
        try
        {
            respJson = client.MakeRequest("", headers, out code, out succeed);
        }
        catch (Exception ex)
        {
        }

以前有人见过吗?谢谢!

看起来好像您从未在任何地方设置Accept标头。这不太可能导致未授权错误,但这不是您的 api,所以谁知道呢。

此外,您可能希望考虑通过在构造函数或 MakeRequest 方法中传递令牌来显式设置授权,然后使用

request.Headers.Add("Authorization", myAuthorizationToken);

最新更新