2017-09-29 9 views
0

私はwebapiで1つの文字列を取得する方法を知っています。しかし、私はwebapiでハッシュテーブルを使う方法を知らない。ハッシュテーブルでは、フォームごとに異なる条件がありますが、同じAPIを呼び出すためです。WebAPIの条件としてHashtableを使用してデータを取得する方法は?

文字列をダウンロード中にエラーを与えている
System.Collections.Hashtable _condition = new System.Collections.Hashtable(); 
      if (TPX.StringHelper.NVL(cbxStatus.EditValue, "-Please Select-") != "-Please Select-") 
       _condition.Add("Status", cbxStatus.EditValue.ToString()); 
      if (TPX.StringHelper.NVL(cbxCenter.EditValue, "-Please Select-") != "-Please Select-")    
       _condition.Add("Center", cbxCenter.EditValue.ToString()); 
      if (chkHideDone.Checked) 
       _condition.Add("IsDone", Convert.ToInt32(!chkHideDone.Checked)); 

     _condition.Add("StartDate", dtpBegin.DateTime.ToString("yyyyMMdd")); 
     _condition.Add("EndDate", dtpEnd.DateTime.ToString("yyyyMMdd")); 

     string itemJson = Newtonsoft.Json.JsonConvert.SerializeObject(_condition); 

     string navURL = GlobalParameters.Host + "api/Order/RetrieveOrderList?conditions="+itemJson; 

     using (System.Net.WebClient webClient = new System.Net.WebClient()) 
     { 
      webClient.Headers["Content-Type"] = "application/json"; 
      webClient.Encoding = Encoding.UTF8;     

      string sJson = webClient.DownloadString(navURL); List<Models.OrderList> myDeserializedObjList = (List<Models.OrderList>)Newtonsoft.Json.JsonConvert.DeserializeObject(sJson, typeof(List<Models.OrderList>)); 
      grdOrder.DataSource = myDeserializedObjList; 
     } 

(webclient.downloadstring(navURL)):

私は.net3.5

例を使用しています。 注:同じロジックをコピーしてもう1つを作成し、ハッシュテーブルではなく1つのフィールドでフィルタリングしました。問題はありません。 私はプロジェクトの異なる場所で同じロジックを使用しているので、供給される条件だけが異なるので、実際にhashtbaleが必要です。

本当にありがとうございます。ありがとう。

答えて

0

HashtbaleをJSONにシリアル化すると、結果の文字列には、URL querystringの有効な文字ではない引用符(およびその他の特殊文字も含む)が含まれます。これらの文字は、percent encodingを使用してエンコードする必要があります。これを行うには、Uri.EscapeDataString静的メソッドを使用できます。

string navURL = GlobalParameters.Host + "api/Order/RetrieveOrderList?conditions=" + Uri.EscapeDataString(itemJson); 


EDIT:
あなたは

にWebAPIのに辞書を渡す方法をいくつかの例を見つけるかもしれないが、これは私のために動作します:

// Declare binder that will convert parameters to Hashtable 
public class HashtableBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var json = bindingContext?.ValueProvider?.GetValue(bindingContext.ModelName)?.AttemptedValue as string; 
     if (json != null) 
     { 
      //Deserialize using Microsoft's JSON serializer 
      var serializer = new JavaScriptSerializer(); 
      bindingContext.Model = serializer.Deserialize<Hashtable>(json); 
      //or deserialize using Newtonsoft JSON convertor 
      //bindingContext.Model = JsonConvert.DeserializeObject<Hashtable>(json); 
      return true; 
     } 
     return false; 
    } 
} 


// In your controller, decorate parameter 
// with FromUri attribute and specify HashtableBinder 
// as BinderType 
[HttpGet] 
[Route("api/Order/RetrieveOrderList")] 
public void RetrieveOrderList([FromUri(BinderType = typeof(HashtableBinder), Name = "conditions")]Hashtable conditions) 
{ 
    // access hashtable in conditions parameter, e.g. var status = conditions["Status"] 
} 
+0

お勧めしたとおりに試みました。しかし、同じエラーが返されました(エラー500、内部サーバーエラー)。変更を適用する前に、私のapiリンクはhttp:// localhost:8989/api/Order/RetrieveOrderList?conditions = {"StartDate": "20170923"、 "Status": "100"、 "EndDate": "20170930"現在のhttp:// localhost:8989/api/Order/RetrieveOrderList?条件=%7B%22StartDate%22%3A%2220170923%22%2C%22Status%22%3A%22100%22%2C%22終了日%22% 3A%2220170930%22%7D – Mdyahiya

+0

詳細については100%確信することはできませんが、エラー500は通常、サーバー上のWebAPI要求を処理するメソッドが未処理の例外をスローするときに発生します。だから、WebClientではなく、サーバー上で問題が発生しています。サーバーコードをデバッグし、例外がスローされる理由を確認する必要があります。 –

+0

@Nuf、私は同じロジックを使用しており、私のデータモデルは他のプロジェクトで例外なく動作します。私が呼び出しているときにwebapiを与えるエラーが発生します。だから、私のapi呼び出しメソッドで何かが間違って感じる。私はHTTPGETを使用しています。私はHTTP Postがデータを取得するために動くのかどうか分からない。私もそれを試みた。 webapiでハッシュテーブル条件で取得するためのいくつかの例が素晴らしいでしょう。ありがとう – Mdyahiya

関連する問題