【问题标题】:Adding parameters to an HttpWebRequest向 HttpWebRequest 添加参数
【发布时间】:2014-04-16 07:27:02
【问题描述】:

这个问题已经被问了一百万次,但没有一个对我有用。我最兴奋的是Http Post for Windows Phone 8,但因为它需要委托,所以它不适合我的代码...... Postdata 函数是从存储库中调用的,如果能直接从这个函数中得到响应就好了!

如何在此代码中添加帖子参数?我已经尝试让它工作了 10 个小时。

// Repository code

string url = "/bla/bla/" + blaId + "/";
Dictionary<string, string> postParams = new Dictionary<string, string>();
postParams.Add("value", message);
string response = await BlaDataContext.PostData(url, postParams);

// ...

public static async Task<string> PostData(string url, Dictionary<String, String> postParams)
{
    HttpWebRequest request = WebRequest.CreateHttp(APIURL + url);
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";
    postParams.Add("oauth_token", Contract.AccessToken); // where do I add this to the request??

    try
    {
        HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();

        Debug.WriteLine(response.ContentType);
        Stream responseStream = response.GetResponseStream();
        string data;
        using (var reader = new StreamReader(responseStream))
        {
            data = reader.ReadToEnd();
        }
        responseStream.Close();

        return data;
    }
    catch (Exception e)
    {
        // whatever
    }
}

【问题讨论】:

    标签: c# windows-phone-8


    【解决方案1】:
    HttpWebRequest request = WebRequest.CreateHttp("" + url);
    //we could move the content-type into a function argument too.
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";
    postParams.Add("oauth_token", ""); // where do I add this to the request??
    try
    {
        //this is how you do it
        using(var stream = await request.GetRequestStreamAsync())
        {
            byte[] jsonAsBytes = Encoding.UTF8.GetBytes(string.Join("&", postParams.Select(pp => pp.Key + "=" + pp.Value)));
            await stream.WriteAsync(jsonAsBytes, 0, jsonAsBytes.Length);
        }
        HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
    
        Debug.WriteLine(response.ContentType);
        System.IO.Stream responseStream = response.GetResponseStream();
        string data;
        using (var reader = new System.IO.StreamReader(responseStream))
        {
            data = reader.ReadToEnd();
        }
        responseStream.Close();
    
        return data;
    }
    

    Async Await HttpWebRequest 扩展:

    public static class HttpExtensions
    {
        public static Task<Stream> GetRequestStreamAsync(this HttpWebRequest request)
        {
            var tcs = new TaskCompletionSource<Stream>();
    
            try
            {
                request.BeginGetRequestStream(iar =>
               {
                   try
                   {
                       var response = request.EndGetRequestStream(iar);
                       tcs.SetResult(response);
                   }
                   catch (Exception exc)
                   {
                       tcs.SetException(exc);
                   }
               }, null);
            }
            catch (Exception exc)
            {
                tcs.SetException(exc);
            }
    
            return tcs.Task;
        }
        public static Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request)
        {
            var taskComplete = new TaskCompletionSource<HttpWebResponse>();
            request.BeginGetResponse(asyncResponse =>
            {
                try
                {
                    HttpWebRequest responseRequest = (HttpWebRequest)asyncResponse.AsyncState;
                    HttpWebResponse someResponse =
                       (HttpWebResponse)responseRequest.EndGetResponse(asyncResponse);
                    taskComplete.TrySetResult(someResponse);
                }
                catch (WebException webExc)
                {
                    HttpWebResponse failedResponse = (HttpWebResponse)webExc.Response;
                    taskComplete.TrySetResult(failedResponse);
                }
            }, request);
            return taskComplete.Task;
        }
    }
    

    有了扩展,我觉得它更干净了。

    【讨论】:

    • 对您的帖子稍作补充,我相信我已经接近了...我会进行编辑,以便您可以看到我做了什么
    • 对,我认为这是有效的...很难说,因为当我发送正确的 oauth 令牌时,我得到“oauth 令牌已过期”...但是哦,哈哈...我一定是现在关闭。感谢兄弟的帮助!
    【解决方案2】:

    您需要将参数写入请求正文。

    你可以使用这样的扩展方法:

    public static void AddFormData(this HttpWebRequest request, IDictionary<string, string> data)
    {
        using (var memStream = new MemoryStream())
        using (var writer = new StreamWriter(memStream))
        {
            bool first = true;
            foreach (var d in data)
            {
                if (!first)
                    writer.Append("&");
                writer.Write(Uri.EscapeDataString(d.Key));
                writer.Write("=");
                writer.Write(Uri.EscapeDataString(d.Value));
                first = false;
            }
            writer.Flush();
            request.ContentLength = memStream.Length;
            memStream.Position = 0;
            using (var reqStream = request.GetRequestStream())
            {
                memStream.CopyTo(reqStream);
            }
        }
    }
    

    这样称呼它:

    request.AddFormData(postParams);
    

    【讨论】:

    • 不幸的是 request.GetRequestStream 在 windows phone 8 中不存在。
    • @Jimmyt1988,确实,你需要使用异步版本
    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 2021-12-28
    • 2012-01-04
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多