2011-01-20 15 views
4

私は自家製Web APIを使用してデータを取得しようとしています。ドキュメントはすべてPHPで書かれています。私はC#のWebClientクラスを使用していますが、私は、データパラメータをシリアル化する方法を見つけ出すことはできませんC#でクエリ文字列のパラメータとして配列を送信するにはどうすればよいですか?

$params = array(
    'id' => 1 
    ,'data' => array(
     ,'email' => '[email protected]' 
    ) 

$url = "www.someapi.com/api?" . http_build_query($params); 

WebClient wc = new WebClient(); 
wc.QueryString["id"] = "1"; 
wc.QueryString["data"] = // I have no idea. 

string json = wc.DownloadString(apiUrl); 

私がきた私が探してい例がこれです

wc.QueryString["data"] = "[email protected]"; 
wc.QueryString["data"] = Uri.EscapeDataString("data[email][email protected]"); 
wc.QueryString["data"] = Uri.EscapeDataString("email[0][email protected]overflow.com"); 
wc.QueryString["data"] = Uri.EscapeDataString("[email protected]"); 

もちろん、私はhttp_build_query()が実際に何を返すかを見るためにどこにでもPHPをセットアップしていません。

答えて

5

私はついにそれを理解しました。私はこの質問を掲示して私の脳を再起動したと思います。

これは働いていたものです:、

wc.QueryString["data[email]"] = "[email protected]"; 
+0

配列の配列のために、このdynamicalyを解決するためにどのように任意のアイデア?このPHPの混乱のC#同等のものはありますか? – vojta

+0

@vojta配列の配列はどういう意味ですか?キーは何を期待していますか? – FriendlyGuy

2

注意をthis questionはこの答えに非常に関連しているので、私は同様にan answer thereとして、このクラスを置きます。その答えは、このクラスの更新を受け取ります。

私が知る限り、これを行うには何も組み込まれていません。しかし、独自のクラスを作成することができます。

だから私はやった:そうのよう

/// <summary> 
/// Helps up build a query string by converting an object into a set of named-values and making a 
/// query string out of it. 
/// </summary> 
public class QueryStringBuilder 
{ 
    private readonly List<KeyValuePair<string, object>> _keyValuePairs 
    = new List<KeyValuePair<string, object>>(); 

    /// <summary> Builds the query string from the given instance. </summary> 
    public static string BuildQueryString(object queryData, string argSeperator = "&") 
    { 
    var encoder = new QueryStringBuilder(); 
    encoder.AddEntry(null, queryData, allowObjects: true); 

    return encoder.GetUriString(argSeperator); 
    } 

    /// <summary> 
    /// Convert the key-value pairs that we've collected into an actual query string. 
    /// </summary> 
    private string GetUriString(string argSeperator) 
    { 
    return String.Join(argSeperator, 
         _keyValuePairs.Select(kvp => 
              { 
               var key = Uri.EscapeDataString(kvp.Key); 
               var value = Uri.EscapeDataString(kvp.Value.ToString()); 
               return $"{key}={value}"; 
              })); 
    } 

    /// <summary> Adds a single entry to the collection. </summary> 
    /// <param name="prefix"> The prefix to use when generating the key of the entry. Can be null. </param> 
    /// <param name="instance"> The instance to add. 
    /// 
    /// - If the instance is a dictionary, the entries determine the key and values. 
    /// - If the instance is a collection, the keys will be the index of the entries, and the value 
    /// will be each item in the collection. 
    /// - If allowObjects is true, then the object's properties' names will be the keys, and the 
    /// values of the properties will be the values. 
    /// - Otherwise the instance is added with the given prefix to the collection of items. </param> 
    /// <param name="allowObjects"> true to add the properties of the given instance (if the object is 
    /// not a collection or dictionary), false to add the object as a key-value pair. </param> 
    private void AddEntry(string prefix, object instance, bool allowObjects) 
    { 
    var dictionary = instance as IDictionary; 
    var collection = instance as ICollection; 

    if (dictionary != null) 
    { 
     Add(prefix, GetDictionaryAdapter(dictionary)); 
    } 
    else if (collection != null) 
    { 
     Add(prefix, GetArrayAdapter(collection)); 
    } 
    else if (allowObjects) 
    { 
     Add(prefix, GetObjectAdapter(instance)); 
    } 
    else 
    { 
     _keyValuePairs.Add(new KeyValuePair<string, object>(prefix, instance)); 
    } 
    } 

    /// <summary> Adds the given collection of entries. </summary> 
    private void Add(string prefix, IEnumerable<Entry> datas) 
    { 
    foreach (var item in datas) 
    { 
     var newPrefix = String.IsNullOrEmpty(prefix) 
     ? item.Key 
     : $"{prefix}[{item.Key}]"; 

     AddEntry(newPrefix, item.Value, allowObjects: false); 
    } 
    } 

    private struct Entry 
    { 
    public string Key; 
    public object Value; 
    } 

    /// <summary> 
    /// Returns a collection of entries that represent the properties on the object. 
    /// </summary> 
    private IEnumerable<Entry> GetObjectAdapter(object data) 
    { 
    var properties = data.GetType().GetProperties(); 

    foreach (var property in properties) 
    { 
     yield return new Entry() 
        { 
        Key = property.Name, 
        Value = property.GetValue(data) 
        }; 
    } 
    } 

    /// <summary> 
    /// Returns a collection of entries that represent items in the collection. 
    /// </summary> 
    private IEnumerable<Entry> GetArrayAdapter(ICollection collection) 
    { 
    int i = 0; 
    foreach (var item in collection) 
    { 
     yield return new Entry() 
        { 
        Key = i.ToString(), 
        Value = item, 
        }; 
     i++; 
    } 
    } 

    /// <summary> 
    /// Returns a collection of entries that represent items in the dictionary. 
    /// </summary> 
    private IEnumerable<Entry> GetDictionaryAdapter(IDictionary collection) 
    { 
    foreach (DictionaryEntry item in collection) 
    { 
     yield return new Entry() 
        { 
        Key = item.Key.ToString(), 
        Value = item.Value, 
        }; 
    } 
    } 
} 

// Age=19&Name=John%26Doe&Values%5B0%5D=1&Values%5B1%5D=2&Values%5B2%5D%5Bkey1%5D=value1&Values%5B2%5D%5Bkey2%5D=value2 
QueryStringBuilder.BuildQueryString(new 
     { 
     Age = 19, 
     Name = "John&Doe", 
     Values = new object[] 
        { 
        1, 
        2, 
        new Dictionary<string, string>() 
        { 
         { "key1", "value1" }, 
         { "key2", "value2" }, 
        } 
        }, 
     }); 

// 0=1&1=2&2%5B0%5D=one&2%5B1%5D=two&2%5B2%5D=three&3%5Bkey1%5D=value1&3%5Bkey2%5D=value2 
QueryStringBuilder.BuildQueryString(new object[] 
     { 
     1, 
     2, 
     new object[] { "one", "two", "three" }, 
     new Dictionary<string, string>() 
     { 
      { "key1", "value1" }, 
      { "key2", "value2" }, 
     } 
     } 
); 
関連する問題