Отправка поля POST POST для многостраничного/форма-данных с помощью RestSharp

У меня возникли проблемы с использованием RestSharp для API REST, который я должен использовать для проекта, над которым я работаю. Запрос, который мне нужно отправить, состоит из трех частей: ключ API заголовка, файл для загрузки и совокупность данных в формате JSON. API требует отправки части данных с использованием имени поля формы "данные" . По какой-то причине это вызывает проблемы, поскольку он называет поле "данные" внутри тела запроса.

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

var request = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST)
{
    RequestFormat = DataFormat.Json,
    AlwaysMultipartFormData = true,
    JsonSerializer = new RestSharpJsonDotNetSerializer(customSerializer)
};

if (doc is DocA)
    request.AddParameter("data",doc as DocA,ParameterType.RequestBody);
    //request.AddBody(doc as DocA);
else
    request.AddParameter("data", doc as DocB,ParameterType.RequestBody);
    //request.AddBody(doc as DocB);

request.AddFile("file", doc.File.FullName);

Как вы можете видеть, я попытался использовать как метод request.AddBody(doc), так и метод request.AddParameter(name, object, type). Ни один из них, похоже, не отправляет данные должным образом, потому что я получаю ответ от сервера, говорящий, что требуемые параметры отсутствуют. Используя fiddler, я могу видеть двоичные данные, но никогда не данные JSON с обоими этими методами. Я просмотрел документацию RestSharp, но я не могу найти ничего, что позволяет мне указать конкретное имя поля как "данные" для тела данных формы, что, по моему мнению, вызывает проблему, с которой я сталкиваюсь, Что я здесь делаю неправильно?

EDIT: при дальнейшем осмотре с помощью скрипача, похоже, что он не добавляет мои данные JSON вообще к телу HTTP-запроса. Однако, с точкой разрыва непосредственно перед загрузкой (выполнить команду), я вижу все, что было правильно сериализовано в списке параметров (и списке файлов). При проверке с помощью Fiddler я вижу двоичные данные файла, а затем границу multipart/form-data, а затем ничего. Я бы предположил, что это то, где мои данные должны быть...

Ответ 1

Итак, я делаю это, работая над проблемой с использованием метода AddBody, который автоматически убивает изображения с несколькими частями и не отправляет их. Вместо этого следует использовать параметр добавления.

Чтобы решить эту проблему, вам, возможно, придется немного поработать с обеих сторон сообщения.

Чтобы отправить сообщение от клиента, выполните следующие действия:

new RestRequest("<Your URI>");
request.AddParameter("request", tokenRequest.ToJson());
request.AddFile("front", frontImage.CopyTo, "front");
request.AddFile("back", backImage.CopyTo, "back");
request.AddHeader("Content-Type", "multipart/form-data");

На моей стороне веб-службы я принимаю json как аргумент метода и вручную получаю ссылку на файловые потоки:

public JsonResult MyService(StoreImageRequest request)
{
    var frontImage = HttpContext.Request.Files["front"].InputStream;
    var backImage = HttpContext.Request.Files["front"].InputStream;
}

Ответ 2

Если ваш сервер может обрабатывать многочастную часть с частями тела JSON и частями файлов, то:

        var req = new RestRequest(UPLOAD_DOC_URLSEGMENT, Method.POST);

        req.RequestFormat = DataFormat.Json;
        req.AddBody(doc);

        req.AddFileBytes("TestImage", Properties.Resources.TestImage, "TestImage.jpg");

        req.AddHeader("apikey", "MY-API-KEY");
        var resp = restClient.Execute<ApiResult>(req);

На стороне сервера такой запрос с несколькими частями должен обрабатываться как:

    [HttpPost]
    public JsonResult UploadDoc()
    {
        // This is multipart request. So we should get JSON from http form part:
        MyDocModel doc = JsonConvert.DeserializeObject<MyDocModel>(Request.Form[0]);

        foreach (string fileName in request.Files)
        {
            HttpPostedFileBase file = request.Files[fileName];
        }