通过带有文件上传/多部分形式的 POST 使用 REST Web 服务

本文关键字:POST 使用 REST 服务 Web 分形 多部 文件 | 更新日期: 2023-09-27 17:56:44

我有一个使用 Django 创建的 REST Web 服务方法,它处理/处理文件上传。如何使用 C# 从我的窗口窗体/桌面应用程序中使用它?此外,有人可以解释如何在 C# 中进行字典参数传递,就像下面的 python 片段代码一样?

import requests
url = "http://<url>
files = {'file' : open("<filename>", "rb").read(), 'name':'sample.txt'}
r = requests.post(url, files)

通过带有文件上传/多部分形式的 POST 使用 REST Web 服务

如果您可以使用DNF45,那么MultipartFormDataContent将为您完成大部分繁重的工作。以下示例将照片上传到模仿表单帖子的图片粘贴。然后它使用 HtmlAgility 来挑选响应,这比您要求的要远得多,但是当您必须使用交互式网页时,就像它们是 Web 服务一样时,这是一件方便的事情。

显然,您必须更改文件名以指向自己计算机上的图片。这不应该是生产级的,只是我弄清楚如何操作picpaste,因为我太便宜了,无法支付imgur。

using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Mime;
namespace picpaste1
{
  class Program
  {
    static void Main(string[] args)
    {
      var fi = new FileInfo(@"path'to'picture.png");
      using (var client = new HttpClient())
      using (var mfdc = new MultipartFormDataContent())
      using (var filestream = fi.OpenRead())
      using (var filecontent = new StreamContent(filestream))
      {
        filecontent.Headers.ContentDisposition = 
          new ContentDispositionHeaderValue(DispositionTypeNames.Attachment)
        {
          FileName = fi.Name,
          Name = "upload"
        };
        filecontent.Headers.ContentType = new MediaTypeHeaderValue("image/png");
        mfdc.Add(new StringContent("7168000"), "MAX_FILE_SIZE");
        mfdc.Add(filecontent);
        mfdc.Add(new StringContent("9"), "storetime");
        mfdc.Add(new StringContent("no"), "addprivacy");
        mfdc.Add(new StringContent("yes"), "rules");
        var uri = "http://picpaste.com/upload.php";
        var res = client.PostAsync(uri, mfdc).Result;
        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(res.Content.ReadAsStringAsync().Result);
        uri = doc.DocumentNode.SelectNodes("//td/a").First()
          .GetAttributeValue("href","NOT FOUND");
        res = client.GetAsync(uri).Result;
        doc.LoadHtml(res.Content.ReadAsStringAsync().Result);
        var foo = doc.DocumentNode.SelectNodes("//div[@class='picture']/a").First()
          .GetAttributeValue("href","NOT FOUND");
        Console.WriteLine("http://picpaste.com{0}", foo);
        Console.ReadLine();
      }
    }
  }
}

如果响应是 JSON 而不是 HTML(可能适用于 Web 服务),请使用 Newtonsoft.Json 解析器。网上到处都有教程。它全面且非常快速,是我的首选武器。从广义上讲,您可以创建类来对 JSON 中期望的对象图进行建模,然后使用它们键入泛型方法调用。

using Newtonsoft.Json;
var res = client.PostAsync(uri, mfdc).Result;
Foo foo = JsonConvert.DeserializeObject<Foo>(res.Content.ReadAsStringAsync().Result);

您可以从NuGet获取HtmlAgility和Newtonsoft.Json。