Как бы вы загрузили параметр, который является массивом, используя c # webclient?
public string CallWebService(string url, NameValueCollection parametres, string HttpVerb = "GET")
{
WebClient myWebClient = new WebClient();
byte[] myresponse = myWebClient.UploadValues(url, HttpVerb, parametres);
// on essaye de récuopérer l'encoding depuis les headers
// sinon on utilise l'encoding par defaut
Encoding encoding;
encoding = WebUtils.GetEncodingFrom(myWebClient.ResponseHeaders, Encoding.Default);
return encoding.GetString(myresponse);
}
CallWebService(url, new NameValueCollection {
{ "type_pj", "99_AU" },
{ "type_pj", "41_NC" },
{ "type_pj", "41_NC" }
}, "PATCH")
не понимается на стороне сервера. Это видно как одна строка "99_AU, 41_NC, 41_NC".
Если я использую
CallWebService(url, new NameValueCollection {
{ "type_pj[]", "99_AU" },
{ "type_pj[]", "41_NC" },
{ "type_pj[]", "41_NC" }
}, "PATCH")
он рассматривается как массив, но содержит только одну строку ["99_AU, 41_NC, 41_NC"]
Следующий локон получит свое право.
curl -X PATCH \ https://... \ -d 'type_pj%5B%5D=99_AU&type_pj%5B%5D=41_NC&type_pj%5B%5D=41_NC'
Серверы видят его как массив из 3 строк ["99_AU", "41_NC", "41_NC"]
Как я могу добиться того же, используя веб-клиента?
[EDIT]
Похоже, я перепутал System.Collections.Specialized.NameValueCollection и System.Web.HttpValueCollection (который также является NameValueCollection, но с дополнительными функциями)
var nv = new NameValueCollection {};
nv.Add("type_pj[]", "99_AU");
nv.Add("type_pj[]", "41_NC");
nv.Add("withcomma", "text,with,comma");
nv.Add("type_pj[]", "41_NC");
=> nv["type_pj[]"] = "99_AU,41_NC,41_NC" // = nv[0]
=> nv["withcomma"] = "text,with,comma" // = nv[1]
var hv = HttpUtility.ParseQueryString(string.Empty);
hv.Add("type_pj[]", "99_AU");
hv.Add("type_pj[]", "41_NC");
hv.Add("withcomma", "text,with,comma");
hv.Add("type_pj[]", "41_NC");
string resp = hv.ToString();
=> hv["type_pj[]"] = "99_AU,41_NC,41_NC" // = hv[0]
=> hv["withcomma"] = "text,with,comma" // = hv[1]
В коллекции HttpValueCollection, когда вы добавляете новое значение для существующего ключа, оно выглядит так, как будто оно объединяет новое значение с предыдущим, но под капотом оно также сохраняется в массиве.
=> hv.GetValues("type_pj[]") = ["99_AU","41_NC","41_NC"] // !!! Array of 3 strings
=> hv.GetValues("withcomma[]") = ["text,with,comma"] // !!! Array of 1 strings
HttpValueCollection имеет метод ToString (), который выполняет кодировку URL для вас и сохраняет структуру массива!
=> hv.ToString() ="type_pj%5b%5d=99_AU&type_pj%5b%5d=41_NC&type_pj%5b%5d=41_NC&withcomma=text%2cwith%2ccomma"
Так что лучшим решением, вероятно, является использование uploadString, как предложено elgonzo. Но вместо использования Lis вы можете использовать HttpValueCollection, метод ToString () которого позаботится о кодировании urlen для вас.