Как вручную создать вложенные параметры POST для веб-запроса http? У меня есть клиент .NET C #, для которого я создаю HTTP-запрос к странице Rails. Пока все хорошо, однако я заметил, что параметры, которые я создаю для запроса (пары ключ / значение), как ожидается, будут вложенными. Я на самом деле также испытываю трудности, пытаясь выработать в контроллере before_filter, как выполнить «вставку» необработанного содержимого запроса, чтобы увидеть, как успешный запрос форматирует его.
ОЖИДАНИЕ НАЗАД ЖЕЛЕЗНОДОРОЖНЫХ (успешный вход в систему, когда я звонил из браузера (не .net))
action_controller.request.request_parameters: !map:HashWithIndifferentAccess
commit: Save
webfile: !map:HashWithIndifferentAccess
path: winter
file: &id005 !ruby/object:File
content_type: image/jpeg
original_path: Winter.jpg
C # Создание параметра:
var form = new NameValueCollection();
form["path"] = "winter"; ==> THIS DOESN'T WORK BECAUSE I THINK IT MAY HAVE TO BE NESTED WITHIN THE "webfile" HASH
C # Рутина:
public static HttpWebResponse Upload(HttpWebRequest req, UploadFile[] files, NameValueCollection form)
{
List<MimePart> mimeParts = new List<MimePart>();
try
{
foreach (string key in form.AllKeys)
{
StringMimePart part = new StringMimePart();
part.Headers["Content-Disposition"] = "form-data; name=\"" + key + "\"";
part.StringData = form[key];
mimeParts.Add(part);
}
int nameIndex = 0;
foreach (UploadFile file in files)
{
StreamMimePart part = new StreamMimePart();
if (string.IsNullOrEmpty(file.FieldName))
file.FieldName = "file" + nameIndex++;
part.Headers["Content-Disposition"] = "form-data; name=\"" + file.FieldName + "\"; filename=\"" + file.FileName + "\"";
part.Headers["Content-Type"] = file.ContentType;
part.SetStream(file.Data);
mimeParts.Add(part);
}
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.Method = "POST";
long contentLength = 0;
byte[] _footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");
foreach (MimePart part in mimeParts)
{
contentLength += part.GenerateHeaderFooterData(boundary);
}
req.ContentLength = contentLength + _footer.Length;
byte[] buffer = new byte[8192];
byte[] afterFile = Encoding.UTF8.GetBytes("\r\n");
int read;
using (Stream s = req.GetRequestStream())
{
foreach (MimePart part in mimeParts)
{
s.Write(part.Header, 0, part.Header.Length);
while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
s.Write(buffer, 0, read);
part.Data.Dispose();
s.Write(afterFile, 0, afterFile.Length);
}
s.Write(_footer, 0, _footer.Length);
}
return (HttpWebResponse)req.GetResponse();
}
catch
{
foreach (MimePart part in mimeParts)
if (part.Data != null)
part.Data.Dispose();
throw;
}
}
Спасибо
PS. В частности, я думаю, что я после того, как:
* как Rails сериализует параметр / хэш вложенной формы в фактическое тело HTTP-запроса и / или
* указатель на определенный класс в кодовой базе Rails, который делает это (поэтому я могу посмотреть, а затем эмулировать в моем клиенте .net)