【问题标题】:Httpwebrequest--POST method using text fileHttpwebrequest--使用文本文件的POST方法
【发布时间】:2012-08-07 18:08:53
【问题描述】:

我正在尝试使用 .NET 类而不是 curl 命令行来复制 Couch 数据库。我以前从未使用过 WebRequest 或 Httpwebrequest,但我正在尝试使用它们通过以下脚本发出发布请求。

这是用于 couchdb 复制的 JSON 脚本(我知道这是可行的):

{ ""_id"":"database_replicate8/7/12", "source":sourcedb, ""target"":"targetDB", ""create_target"":true, ""user_ctx"": { ""roles"": ["myrole"] } }

上面的脚本被放入一个文本文件,sourcefile.txt。我想使用 .NET 功能将其放入 POST Web 请求中。

经过研究,我选择使用 httpwebrequest 类。以下是我目前所拥有的——我是从http://msdn.microsoft.com/en-us/library/debx8sh9.aspx 得到的

 HttpWebRequest bob = (HttpWebRequest)WebRequest.Create("sourceDBURL");
 bob.Method = "POST";
 bob.ContentType = "application/json";
 byte[] bytearray = File.ReadAllBytes(@"sourcefile.txt");
 Stream datastream = bob.GetRequestStream();
 datastream.Write(bytearray, 0, bytearray.Length);
 datastream.Close();

我这样做对吗?我对网络技术比较陌生,并且仍在学习 http 调用的工作原理。

【问题讨论】:

    标签: c# .net httpwebrequest couchdb


    【解决方案1】:

    这是我用来创建 POST 请求的一种方法:

     private static HttpWebRequest createNewPostRequest(string apikey, string secretkey, string endpoint)
     {
        HttpWebRequest request = WebRequest.Create(endpoint) as HttpWebRequest;
        request.Proxy = null;
        request.Method = "POST";
        //Specify the xml/Json content types that are acceptable. 
        request.ContentType = "application/xml";
        request.Accept = "application/xml";
    
        //Attach authorization information
        request.Headers.Add("Authorization", apikey);
        request.Headers.Add("Secretkey", secretkey);
        return request;
     }
    

    在我的主要方法中,我这样称呼它:

    HttpWebRequest request = createNewPostRequest(apikey, secretkey, endpoint);
    

    然后我将我的数据传递给这样的方法:

    string requestBody = SerializeToString(requestObj);
    
    byte[] byteStr = Encoding.UTF8.GetBytes(requestBody);
    request.ContentLength = byteStr.Length;
    
    using (Stream stream = request.GetRequestStream())
    {
        stream.Write(byteStr, 0, byteStr.Length);
    }
    
    //Parse the response
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        //Business error
        if (response.StatusCode != HttpStatusCode.OK)
        {
            Console.WriteLine(string.Format("Error: response status code is{0}, at time:{1}", response.StatusCode, DateTime.Now.ToString()));
    
            return "error";
        }
        else if (response.StatusCode == HttpStatusCode.OK)//Success
        {
            using (Stream respStream = response.GetResponseStream())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(SubmitReportResponse));
                reportReq = serializer.Deserialize(respStream) as SubmitReportResponse;
            }
    
         }
    ...
    

    在我的例子中,我从一个类中序列化/反序列化我的身体——你需要改变它来使用你的文本文件。如果您想要一个简单的解决方案,请将SerializetoString 方法更改为将您的文本文件加载到字符串的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-19
      • 2012-03-02
      相关资源
      最近更新 更多