Missa inte Amazon Prime Day i Dagens fynd

C#: Hur gör man en simpel postrequest med webbrowser?

Permalänk

C#: Hur gör man en simpel postrequest med webbrowser?

Hejsan.

Jag har gjort ett simpelt program. Den innehåller button1, webbrowser1.
När man klickar på button1 så kommer det upp en Micrisoft.Visual.Basic.inputbox som frågar vilken parameter jag tänker skriva till en string. Det är alltså en import från VB.net

Men hur som helst, då har jag parametern i en string och då undrar jag hur jag gör en postrequest och samtidigt laddar upp sidan på min webbrowser. Det är inget login eller password utan helt enkelt simpel textbox och button på sidan. När jag skickar parametern till sidan så ska webbrowser sedan ladda upp sidan på skärmen.

Jag har kollat på detta exempel:
http://www.hanselman.com/blog/HTTPPOSTsAndHTTPGETsWithWebClie...

Men jag vet inte hur jag ska få webbrowser1.navigate(url) att ladda upp.
Sen är jag inte van med post på C#. Den är mycket invecklad jämfört med c#

Vet du hur man gör?

Permalänk
Skrivet av xzhaskd:

Inte riktigt med på vad du vill göra men om jag förstår dig rätt har du en webbsida laddad i en WebBrowser kontroll och du vill sätta ett värde i en textbox på den sidan ?

Man kan komma åt webbsidan genom Document egenskapen, det finns ett exempel på hur man gör här:
http://msdn.microsoft.com/en-us/library/system.windows.forms....

Kanske lite lättare om jag tar ett random exempel istället.
http://finance.yahoo.com/q/ta?s=SVU+Basic+Tech.+Analysis

Ser du knappen Compare: SVU vs X Compare?
Hur skulle du göra om du ville skriva in t.ex något där och sedan ladda upp det på webbrowsern?

Detta är ett klassiskt exempel på value="" som du ser i källsidan.

Permalänk
Skrivet av xzhaskd:

webBrowser1.Document.GetElementById("bchartCompareTicker").SetAttribute("value", "C");
webBrowser1.Document.GetElementById("frmCompareTicker").InvokeMember("submit");

Sidan måste laddats färdigt först innan du kan komma åt DOM.

Nu hänger jag inte med riktigt. Hur kom du fram till det där?
Är det bara att jag skriver in det där fast ändrar C till någon annan string?

Permalänk
Skrivet av xzhaskd:

Jag läste dokumentationen på webbrowser och kollade upp id taggarna på sidan.

I det här fallet med yahoo funkar det ju att lägga ticker koden som en url parameter lika gärna, behövs alltså inte att sätta något i fomuläret där.

Hur menar du riktigt?
Ska jag kopiera hela sidan?

Permalänk
Skrivet av xzhaskd:

Jag vet ju inte vad du vill göra, du fick svar på din fråga om hur du kunde sätta ett värde i ett formulär på en webbsida, om du sedan behöver det eller itne vet du kanske bäst själv.

Yahoo har också ett gäng API:er för utvecklare om det nu är yahoo du tänker hämta data från, som till exempel Yahoo Query language men det finns naturligtvis en begränsning på hur mycket man får hämta.

Ett exempel:
http://www.jarloo.com/get-yahoo-finance-api-data-via-yql/

Möjligtvis är det overkill för din del då du verkar precis börjat programmera men bara för att visa att det finns oftast api:er från de större sajterna och man behöver inte skrapa information direkt från webbsidorna.

Jag har nyss börjat programera.
Jag vill bara skicka ett värde till en textbox och sen trycka på knappen och sedan ladda upp hemsidan.

Ta t.ex en hemsida där det står "Skriver du 1 så kommer du in på Y hemsida och skriver du 2 kommer du in på X hemsida." Sen skriver man talet i textboxen och sedan tycker på en knapp.

Och då ska en ny hemsida visa upp sig.
Det är de jag vill, men jag vet inte direkt hur.

Permalänk

Har gjort en liten kod nu, som ska fungera enligt den som har skrivit den. Jag har bara lagt det som är i början.

Men koden fungerar inte. Eller den ger inga error, men den gör inte som jag vill.

private void compareWithToolStripMenuItem_Click(object sender, EventArgs e) { try { string company_name = Microsoft.VisualBasic.Interaction.InputBox("Enter the company you would like to compare with\nJust leave the textbox empty if you want to remove the compare-company", "Compare with a another company", "comapny name..."); ASCIIEncoding encoding = new ASCIIEncoding(); string postData = "value=" + company_name; byte[] data = encoding.GetBytes(postData); WebRequest request = WebRequest.Create(webBrowser1.Url.ToString()); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; Stream stream = request.GetRequestStream(); stream.Write(data, 0, data.Length); stream.Close(); WebResponse response = request.GetResponse(); stream = response.GetResponseStream(); StreamReader sr = new StreamReader(stream); MessageBox.Show(sr.ReadToEnd()); sr.Close(); stream.Close(); } catch (Exception ex) { MessageBox.Show("Error : " + ex.Message); } webBrowser1.Navigate(webBrowser1.Url.ToString()); }

Jag får svaret från messbox "The remote server returned an error: (405) Method Not Allowed"
Från denna MessageBox.Show("Error : " + ex.Message);

Här är manualen jag följde:
http://www.youtube.com/watch?v=PqrfmAmgn3U

Permalänk

Lite svårt att förstå vad det är du vill göra. Tänk på att alltid skriva mycket tydliga frågor så att inget är öppet för olika tolkningar.

Citat från dig:
"Skriver du 1 så kommer du in på Y hemsida och skriver du 2 kommer du in på X hemsida. Sen skriver man talet i textboxen och sedan tycker på en knapp. Och då ska en ny hemsida visa upp sig. "

Av detta tycker jag det låter som att du vill mata in t ex google i textboxen och sedan ska webBrowser1 visa t. ex. google.com. Om det är rätt uppfattat så kan du komma igång med den här koden:

private void compareWithToolStripMenuItem_Click(object sender, EventArgs e) { try { string company_name = Microsoft.VisualBasic.Interaction.InputBox("Enter the company you would like to compare with\nJust leave the textbox empty if you want to remove the compare-company", "Compare with a another company", "comapny name..."); switch (company_name.ToLower()) { case "google": webBrowser1.Navigate("http://google.com", false); break; case "aftonbladet": webBrowser1.Navigate("http://aftonbladet.se", false); break; } } catch (Exception ex) { MessageBox.Show("Error : " + ex.Message); } }

EDIT:
Jag utgår från att du har fått Microsoft.VisualBasic.Interaction.InputBox att fungera som du vill? Känns lite udda att ha VisualBasic prylar i ett C# program...

Visa signatur

The Programmer

Permalänk
Medlem
Skrivet av TheProgrammer:

EDIT:
Jag utgår från att du har fått Microsoft.VisualBasic.Interaction.InputBox att fungera som du vill? Känns lite udda att ha VisualBasic prylar i ett C# program...

InputBox existerar ej i C# så det är väl lättare att använda VBs implementation än att göra en själv om man är färsk

Permalänk

Ja bara det funkar så...

Visa signatur

The Programmer

Permalänk

Förresten kan du korta ner det ännu mer typ detta:

private void compareWithToolStripMenuItem_Click(object sender, EventArgs e) { string company_name = Microsoft.VisualBasic.Interaction.InputBox("Enter the company you would like to compare with\nJust leave the textbox empty if you want to remove the compare-company", "Compare with a another company", "comapny name..."); switch (company_name.ToLower()) { case "google": webBrowser1.Navigate("http://google.com", false); break; case "aftonbladet": webBrowser1.Navigate("http://aftonbladet.se", false); break; } }

Visa signatur

The Programmer

Permalänk
Medlem
Skrivet av TheProgrammer:

Förresten kan du korta ner det ännu mer typ detta:

Vist kan man ta bort felhanteringen, dock är min fråga, varför skulle du vilja ta bort felhanteringen där?

Din kod, ifall den inte hittar något i switch satsen kommer kasta ett exception som du nu inte hanterar.

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 5090
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck, Rog Ally + de fiesta konsoler.

Permalänk
Medlem
Skrivet av MugiMugi:

Din kod, ifall den inte hittar något i switch satsen kommer kasta ett exception som du nu inte hanterar.

finns det inget matchande case, så hoppar den helt sonika över switchen.
det blir samma effekt som om man skriver in default: break;

(däremot kan det ju givetvis kastas ett undantag om company_name är null, vilket ju medför att .ToLower() inte kan köras, men det har ju inget med switchen att göra egentligen.)

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Japp, det finns inget problem med switchen.

try/catch kändes mer som att det tillhörde IO relaterade delar av koden som WebRequest.

Visst kan man (och bör) hantera fallet med null från InputBox om nu InputBox kan lämna null och inte "" när fältet är tomt. Om det är null kan man sätta värdet till "" (string.Empty) eller till ett default värde som i denna koden:

private void compareWithToolStripMenuItem_Click(object sender, EventArgs e) { string company_name = Microsoft.VisualBasic.Interaction.InputBox("Enter the company you would like to compare with\nJust leave the textbox empty if you want to remove the compare-company", "Compare with a another company", "comapny name..."); if(company_name == null) company_name = "google"; switch (company_name.ToLower()) { case "google": webBrowser1.Navigate("http://google.com", false); break; case "aftonbladet": webBrowser1.Navigate("http://aftonbladet.se", false); break; } }

Detta är ett bättre sätt än att använda try/catch för ett input värde som ovanstående. Koden var menat för att komma vidare med, inte att vara helt komplett... det finns t ex lite kvar att göra. Vad ska hända om användaren inte matar in något av de två case exemplen osv? Det riktiga problemet var att få webBrowser1 att visa en websida.

Visa signatur

The Programmer