1

postAsyncヘッダーとコンテンツを一緒にする必要があります。C# のコンソール アプリケーションを介して Web サイトにアクセスするため。HttpHeader変数名 header を持つオブジェクトとしてヘッダーを持ちnewContent、コンテンツは__Tokenreturn、. 今私がやりたいことは、 newContent をヘッダーに追加し、それを使用して POST リクエストを作成することです。EmailPasswordpostAsync(url, header+content)

public async static void DownloadPage(string url)
{
    CookieContainer cookies = new CookieContainer();
    HttpClientHandler handler = new HttpClientHandler();
    handler.CookieContainer = cookies;

    using (HttpClient client = new HttpClient(handler))
    {
        using (HttpResponseMessage response = client.GetAsync(url).Result)
        {
            //statusCode
            CheckStatusCode(response);
            //header
            HttpHeaders headers = response.Headers;
            //content
            HttpContent content = response.Content;
            //getRequestVerificationToken&createCollection
            string newcontent = CreateCollection(content);

            using(HttpResponseMessage response2 = client.PostAsync(url,))

        }

    }
}

public static string GenerateQueryString(NameValueCollection collection)
{
    var array = (from key in collection.AllKeys
                 from value in collection.GetValues(key)
                 select string.Format("{0}={1}", WebUtility.UrlEncode(key), WebUtility.UrlEncode(value))).ToArray();
    return string.Join("&", array);
}


public static void CheckStatusCode(HttpResponseMessage response)
{
    if (response.StatusCode != HttpStatusCode.OK)
        throw new Exception(String.Format(
       "Server error (HTTP {0}: {1}).",
       response.StatusCode,
       response.ReasonPhrase));
    else
        Console.WriteLine("200");
}
public static string CreateCollection(HttpContent content)
{
    var myContent = content.ReadAsStringAsync().Result;
    HtmlNode.ElementsFlags.Remove("form");
    string html = myContent;
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    var input = doc.DocumentNode.SelectSingleNode("//*[@name='__Token']");
    var token = input.Attributes["value"].Value;
    //add all necessary component to collection
    NameValueCollection collection = new NameValueCollection();
    collection.Add("__Token", token);
    collection.Add("return", "");
    collection.Add("Email", "11111111@hotmail.com");
    collection.Add("Password", "1234");
    var newCollection = GenerateQueryString(collection);
    return newCollection;
}
4

3 に答える 3

1

私も昨日まったく同じことをしました。コンソール アプリ用に別のクラスを作成し、そこに HttpClient のものを配置しました。

主に:

_httpCode = theClient.Post(_response, theClient.auth_bearer_token);

クラスで:

    public long Post_RedeemVoucher(Response _response, string token)
    {
        string client_URL_voucher_redeem = "https://myurl";

        string body = "mypostBody";

        Task<Response> content = Post(null, client_URL_voucher_redeem, token, body);

        if (content.Exception == null)
        {
            return 200;
        }
        else
            return -1;
    }

次に、呼び出し自体:

    async Task<Response> Post(string headers, string URL, string token, string body)
    {
        Response _response = new Response();

        try
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, URL);
                request.Content = new StringContent(body);

                using (HttpResponseMessage response = await client.SendAsync(request))
                {
                    if (!response.IsSuccessStatusCode)
                    {
                        _response.error = response.ReasonPhrase;
                        _response.statusCode = response.StatusCode;

                        return _response;
                    }

                    _response.statusCode = response.StatusCode;
                    _response.httpCode = (long)response.StatusCode;

                    using (HttpContent content = response.Content)
                    {
                        _response.JSON = await content.ReadAsStringAsync().ConfigureAwait(false);
                        return _response;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            _response.ex = ex;
            return _response;
        }
    }

これがあなたを正しい方向に向けてくれることを願っています!

于 2016-08-05T14:27:41.260 に答える
1

あなたを繰り返し処理してオブジェクトHeadersに追加するのはどうですか:Content

var content = new StringContent(requestString, Encoding.UTF8);

// Iterate over current headers, as you can't set `Headers` property, only `.Add()` to the object.
foreach (var header in httpHeaders) { 
    content.Headers.Add(header.Key, header.Value.ToString());
}

response = client.PostAsync(Url, content).Result;

現在、それらは 1 つの方法で送信されます。

于 2016-08-05T14:29:44.250 に答える