2015-04-23 2 views
3

Я пишу клиент C# для стороннего API (я использую пакет RestSharp nuget). В их документации содержатся примеры PHP, которые я должен перевести на C#. Большинство их образцов достаточно просты, и я смог преобразовать их в C#, но я борюсь с одним из них, потому что он принимает массив массивов. Вот пример из их документации:Преобразование массива массивов PHP в C#

$params = array (
    'user_key' => 'X', 
    'client_id'=> 'X, 
    'label' => array(
     array(
      'language' => 'en_US', 
      'name' => 'English label', 
     ), 
     array(
      'language' => 'fr_CA', 
      'name' => 'French label', 
     ), 
    ), 
); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'https://api.3rdparty.com/xxx/yyy'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('apikey: YOURAPIKEY')); 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$result = curl_exec($ch); 

Вот что я до сих пор:

var labels = new Dictionary<string, string>() 
{ 
    { "en_US", "English Label" }, 
    { "fr_CA", "French Label" } 
}; 

var request = new RestRequest("/xxx/yyy", Method.POST) { RequestFormat = DataFormat.Json }; 
request.AddHeader("apikey", myApiKey); 
request.AddParameter("user_key", myUserKey); 
request.AddParameter("client_id", myClientId); 
request.AddParameter("label", ???); 

var client = new RestSharp.RestClient("https://api.3rdparty.com") 
{ 
    Timeout = timeout, 
    UserAgent = "My .NET REST Client" 
}; 
var response = client.Execute(request); 

Кто-нибудь знает, как преобразовать «метки» словарь в формат, который был бы эквивалентен http_build_query РНР?

ответ

2

http_build_query($params) производит вывод, который выглядит следующим образом:

user_key=X&client_id=X&label%5B0%5D%5Blanguage%5D=en_US&label%5B0%5D%5Bname%5D=English+label&label%5B1%5D%5Blanguage%5D=fr_CA&label%5B1%5D%5Bname%5D=French+label 

Который, декодируется, выглядит следующим образом:

user_key=X&client_id=X&label[0][language]=en_US&label[0][name]=English label&label[1][language]=fr_CA&label[1][name]=French label 

Таким образом, вы должны быть в состоянии сделать:

 var request = new RestRequest("/xxx/yyy", Method.POST); 
     request.AddHeader("apikey", myApiKey); 
     request.AddParameter("user_key", myUserKey); 
     request.AddParameter("client_id", myClientId); 
     foreach (var item in labels.Select((pair, i) => new { index = i, language = pair.Key, name = pair.Value })) 
     { 
      request.AddParameter(string.Format("label[{0}][language]", item.index), item.language); 
      request.AddParameter(string.Format("label[{0}][name]", item.index), item.name); 
     } 

Обратите внимание, что из экспериментов я заметил, что RestSharp кодирует пробел как %20, а не как +. Надеюсь, not a problem.

+1

Отлично! Спасибо. – desautelsj

+1

Кстати, мне очень нравится, как вы переформатируете список, чтобы включить индекс каждого элемента. Гораздо удобнее объявлять целое число и увеличивать его на единицу в каждом цикле. – desautelsj

-1

Вы можете использовать HttpBuildQuery, что является зеркальной реализацией этой функции PHP.

+0

Это не очень хорошо работает для меня ... Он неправильно обрабатывает вложенные словари. – vojta

Смежные вопросы