2017-10-16 14 views
1

私はマゼンタのWebサイトから注文をダウンロードするためにREST APIを使用します。RESTリクエストはPOSTMANでは動作しますが、RestClientでは動作しません

私は自分のウェブサイトに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) 
     { 
     } 

は、誰もが前に会っていますか?ありがとう!

+2

はあなたのコードを投稿してください使用して明示的に許可を設定することを検討することを望むかもしれない - これは最小されていないであるとして、完全で検証可能な例https://stackoverflow.com/help/mcve –

+0

@ ste-fuの提案に加えて、追加しようとしたヘッダも含め、RESTリクエストコードを投稿してください。問題は通常は認証トークンです。 –

+1

どのように正確に失敗するのですか?エラー?タイムアウト?例外? – Mark

答えて

0

Acceptヘッダーをどこにも設定していないかのように見えます。これは、認証されていないエラーを引き起こす可能性は低いですが、それはあなたのAPIではないので、誰が知っています。

はまた、あなたは、コンストラクタまたはMakeRequest方法のいずれかでトークンを渡し、その後、

request.Headers.Add("Authorization", myAuthorizationToken); 
関連する問題