C# API 调用不能与 HttpWebRequest 一起使用,但可以与 Postman 一起使用

Posted

技术标签:

【中文标题】C# API 调用不能与 HttpWebRequest 一起使用,但可以与 Postman 一起使用【英文标题】:C# API Call doesn't work with HttpWebRequest but do work with Postman 【发布时间】:2018-03-06 16:24:28 【问题描述】:

我有以下邮递员请求:

这会按预期返回一个 URL:

我正在尝试使用 .Net Core 2.0 应用程序模拟此操作,代码如下:

static void Main(string[] args)

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://epaper.20minuten.ch/index.cfm/epaper/1.0/getEditionDoc");
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Method = "POST";

    var serializer = new Newtonsoft.Json.JsonSerializer();
    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    
        using (var tw = new Newtonsoft.Json.JsonTextWriter(streamWriter))
        
            serializer.Serialize(tw,
                new
                
                    editions = new[]
                    
                            new
                            
                                defId = "648",
                                publicationDate = "2018-03-06"
                            
                    ,
                    isAttachment = true,
                    fileName = "Gesamtausgabe_Lausanne_2018-03-06.pdf"
                );
        
    
    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    
        var responseText = streamReader.ReadToEnd();
        Console.ReadLine();
    

但我收到 500 个错误。我错过了什么?

【问题讨论】:

您使用了很多在这里并不理想的方法。大多数时候你想使用 HttpClient 来发出 Restful 请求。另外,尝试使用JsonConvert.SerializeObject(),它通常是我使用的以及大多数代码示例使用的。 isAttachment 拼写错误。我会运行 Fiddler,并比较好请求和坏请求的负载 @maccettura 我愿意接受建议,你会怎么做? @maccettura 我的错,我从我的评论中删除了。 如果您对使用 RestSharp 感兴趣,您可以让 Postman 通过单击“代码”链接并从下拉列表中选择 C# (RestSharp) 为您生成该 c# 代码。 【参考方案1】:

Postman 可以生成各种各样的代码。要将 RestSharp 与 C# 一起使用,请单击代码按钮/链接并从下拉列表中选择 C# (RestSharp)

它应该类似于:

总有一天我会为 HttpClient 和 HttpWebRequest 贡献一个生成器

【讨论】:

【参考方案2】:

我猜这个问题可能是由于您正在调用一个外部 url,在某些情况下它们可能会阻止像这样的抓取请求。尝试为请求设置一个用户代理来模拟浏览器调用。

【讨论】:

我添加了 ` httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/64.0.3282.186 Safari/537.36";` 但我仍然有同样的问题。为什么它会在邮递员中工作? 邮递员总是设置像用户代理这样的标题,类似于浏览器调用。还可以尝试使用 fiddler 来接听邮递员的电话。 @J4N 刚刚在标题中添加了用户代理并为我工作谢谢。

以上是关于C# API 调用不能与 HttpWebRequest 一起使用,但可以与 Postman 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

C#控制台程序能调用微信api吗

在 C# 中出现异常时重新启动线程 [重复]

C# Xamarin 文件上传到 API 可以使用 RestSharp,但不能使用 HttpClient

关于c#调用java中间件api的几个问题

█c# 为啥有的dll不能直接引用,必须regsvr32 注册后 才能引用?

C#调用Win32 api时的内存操作