【问题标题】:How to get the response over HTTP如何通过 HTTP 获取响应
【发布时间】:2013-04-23 11:17:40
【问题描述】:

我正在发送 HTTP 请求。我需要保存对该请求的 HTTP 响应。

这是请求网址:http://notify.test.com/gateway.do?service=notify_verify&partner=2088&notify_id=abcdefghijklmnopqrst

我试过的代码如下:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://notify.test.com/gateway.do?service=notify_verify&partner=2088&notify_id=abcdefghijklmnopqrst");
        request.Proxy = WebProxy.GetDefaultProxy();
        request.Proxy.Credentials = CredentialCache.DefaultCredentials;
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream resStream = response.GetResponseStream();

响应将是 True 或 False。我怎样才能保存它?

【问题讨论】:

  • 在您的问题中包含 API 密钥不是一个好主意,因为这是一个公共网站。

标签: c# http http-post httprequest httpresponse


【解决方案1】:

如果您的要求很简单,WebClient 会大有帮助:

string result;
using(var client = new WebClient()) {
    client.Proxy = ...
    result = client.DownloadString(uri);
}

另请参阅:DownloadData 等。

【讨论】:

  • 当我在 aspx 页面中使用您的代码块时,结果是“假”或“真”。但是,当我尝试从自定义 Http 处理程序发送请求并将值传递给数据库中的“partner”和“notify_id”时,结果是 XML-<?xml version="1.0" encoding="GBK"?> <api><is_success>F</is_success><error>message</error></api>。为什么这么奇怪?我想要状态,当然是<is_success> 值。所以result 包含一个xml。我写了XmlTextReader rdr = new XmlTextReader(new System.IO.StringReader(result));。如何从 xml 阅读器中读取 <is_success> 值?
  • @Sandy 最简单的方法是加载到 DOM 中。 XmlDocument 可能
【解决方案2】:

您从GetResponseStream() 获得System.IO.StreamStream 提供您可以继续阅读的Read 方法

using(Stream resStream = response.GetResponseStream()){ //release Stream after use
    if(resStream.CanRead){
        byte[] buffer = new byte[resStream.Length]; // or whatever
        if(resStream.Read(buffer, 0, resStream.Length) == 0) 
        {
            // end of Stream
        }
        else{
             //data received, work on buffer
        }
    }
}

请参阅here 以获取System.IO.Stream

【讨论】:

  • 那是非常糟糕的Read 代码;您还没有检查来自Read 的返回值,也没有根据流的结尾或内容长度标头循环读取多个缓冲区。这表明了 IMO 的不良做法。
  • 对于这种特殊情况就足够了,因为 OP 只期望“True”或“False”。
  • http 的有趣之处在于,您需要处理的事情比您预期的要多……但即便如此:TCP 中仍然没有任何内容表明您将获得所有“真" 或 "False" 在单个数据包中。
  • 好的,但这取决于编码器,然后 OP 需要确定这一点
【解决方案3】:
using(var resStream = response.GetResponseStream())
using(var reader = new StreamReader(resStream))
{
    var responseText = reader.ReadToEnd();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多