2016-08-05 21 views
1

Ich brauche postAsync mit Header und Inhalt zusammen. Um Zugriff auf eine Website über die Konsolenanwendung in C# zu erhalten. Ich habe meine Header als HttpHeader Objekt mit variabler Namen-Header und mein Inhalt mit dem Namen newContent als String-Objekt mit __Token, return, Email und Password. Nun, was ich tun möchte, ist NewContent zu Header hinzufügen und dann postAsync(url, header+content) verwenden, um meine POST-Anfrage zu machen.postAsync mit Header und Inhalt C#

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", "[email protected]"); 
    collection.Add("Password", "1234"); 
    var newCollection = GenerateQueryString(collection); 
    return newCollection; 
} 
+0

was meinst du? Ich weiß nur nicht, wie es geht ... @x ... – Puzzle

Antwort

1

Ich tat das gleiche gestern. Ich habe eine separate Klasse für meine Konsolen-App erstellt und den HttpClient-Inhalt dort eingefügt.

In Main:

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

In der Klasse:

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; 
    } 

Dann wird der Anruf selbst:

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; 
     } 
    } 

Ich hoffe, diese Punkte, die Sie in ihm richtige Richtung!

+0

Vielen Dank. Ich werde es versuchen, sobald ich nach Hause komme und Sie wissen lassen, wie es geht :) – Puzzle

+0

Ist es mir oder Sie verwenden nie Ihre Kopfzeile @GrahamJ – Puzzle

1

Wie über Ihre Headers über Iterieren und das Hinzufügen von ihnen zu dem Content Objekt:

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; 

Jetzt sind sie in einem Verfahren gesendet.

+0

Schön, ich werde es versuchen, wenn ich nach Hause komme und Sie wissen lassen, wie es geht.l – Puzzle

+0

Sie kann nicht "header" so hinzufügen ... Ich könnte keinen besseren Weg finden ... – Puzzle

+0

Man kann nicht "header" so hinzufügen ... Ich habe versucht mit header.key für name und header.value.Tostring() für Wert und es hat nicht funktioniert. Es gab den folgenden Fehler Misused Header-Name. Stellen Sie sicher, dass Anforderungsheader mit HttpRequestMessage, Antwortheadern mit HttpResponseMessage und Inhaltsheadern mit HttpContent-Objekten verwendet werden. – Puzzle

0

Wenn Sie sich noch mit diesem Thema beschäftigen, können Sie auch Kopfzeilen auf Anforderungsebene sowie die Ebene HttpClient hinzufügen. Das funktioniert bei mir:

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

request.Content = new StringContent(body); 

request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 
+0

Was ist mit den Cookies? Ich kann nicht scheinen, um Anfrage mit den Cookies zu stellen, die ich von meinem getAsync ... bekomme – Puzzle