Propojení s webserverem   otázka

VB.NET

Ahoj,

mám Visual Studio 2008 a chtěl bych svůj VB program propojit se svym webserverem, na kterém bude spuštěna nějaká jednodušší api. Problém je že nevím kde začít... popřípadě jakou komponentu pro spojení s webserverem hledat.

Nechci se připojovat přímo k MySQL přes nějakej ODBC driver, ale stáhnout normální PHP stránku a rozparsovat ji.

Pro přenos bych asi nejraději použil JSON ale XML se také nebráním.

Díky za pomoc

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Vytvoření API je vyloženě záležitost Vaší fantazie.

server.php?method=db_select_user&id=7 => nějaké čarování s databází => {name:'Zdeněk Dlouhý',age:22,...} a je to.

K zamyšlení jsou ale dvě věci:

1) proč nekomunikovat přímo s databází? Ten mezikrok v podobě php vrstvy je redundantní. Jediný důvod co mě napadá je ten, že nemáte dobrý pocit z ukládání hesla ve Vaší aplikaci, jehož zneužití by mohlo útočníkovi umožnit kontrolu nad celou databází. Php wrapper, který bude umět jen to, co budete chtít by pak dával smysl, mám pravdu?

2) pokud umíte ASP .NET nebo se na něj chystáte, v budoucnu se nejspíše přikloníte k web services http://www.15seconds.com/issue/010430.ht...

RA

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ahoj,

ano mate naprostou pravdu.

Primy propojeni s mysql pouzit nechci:

1) si nejsem uplne jistej jak je to bezpecny, aby se z toho nahodou nestala bezpecnostni dira

2) nedokazu si predstavit ze do programu zadam na tvrdo nazev DB a heslo - co kdyz zmenim heslo? To ho budu menit v kazdym programu?

3) pro web budu vytvaret specialni API i pro ostatni uzivatele (podobnou jakou ma treba youtube, nebo Vimeo.com), takze bych ji taky rad vyuzil.

Vim ze to bude asi trochu pomalejsi, ale to by nemelo zase tak vadit. Na ASP se nijak nechystam i ve VB.NET jsem celkem novacek.

Uz jsem se probojoval k tomu ze jsem stahnul stranku pomoci XMLHTTP60, ale ted se snazim rozkodovat JSON, ale porad mi to nejde.

Stahnul jsem si knihovny JSON.NET, dokonce se mi i neco povedlo, ale nedari se mi z toho dostat normalni pole.

Dim bla = New MSXML2.XMLHTTP60
bla.open("GET", "http://localhost/api.php")
bla.send()
Dim reader As System.IO.TextReader = New System.IO.StringReader(bla.responseText)

Dim json = New Newtonsoft.Json.JsonTextReader(reader)

        While json.Read()
            MsgBox(json.Value)
        End While

To jaksi nejak funguje akorat ve Vasem priklade by to vypsalo

name

Zdeněk Dlouhý

age

22

To znamena ze to vubec nerozlisuje index od hodnot ani jejich zanoreni atd...

Diky za pomoc :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Stažení bude lepší řešit pomocí prostředků .NET frameworku - proč s aplikací zbytečně distribuovat něco navíc, když to můžeme zařídit jednouduše přímo v .NET FW?

Imports System.Net

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim rq As HttpWebRequest = HttpWebRequest.Create("http://localhost/api.php")
        rq.Method = "GET"
        Dim rs As HttpWebResponse = rq.GetResponse()
        Dim json As String = String.Empty
        Using sr As New IO.StreamReader(rs.GetResponseStream())
            json = sr.ReadToEnd()
        End Using

    End Sub
End Class

Pro zpracování JSONu už bude třeba použít nějakou externí knihovnu jako ve Vašem případě a proto si myslím, že pokud to není velký problém, bude asi použít XML jež je podporováno v základu od .NET FW 3.5.

Imports System.Xml.Linq

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim d As XDocument ' = XDocument.Parse("...")
        ' nebo:
        d = <?xml version="1.0" encoding="utf-8"?>
            <doc>
                <node param="value">test</node>
                <!-- comment -->
                <node param="value">test</node>
            </doc>
        Dim sth As String = d.<doc>.<node>(0).Value & Environment.NewLine & d.<doc>.<node>(0).@param
        MsgBox(sth)
    End Sub
End Class

Pokud k XML vytovříte DTD a XSLT šablonu, dá se ve Visual Studiu i nstavit Intellisense tak aby fungovala se strukturou Vašeho dokumentu.

RA

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ahoj,

diky za pomoc, to bude mnohem lepsi nez XMLHTTP. Porad bych ale radsi pouzival JSON nez XML. Prijde mi ze XML prenasi az moc zbytecnych dat a to bych prave nerad. S JSONem jsem zase trochu pokrocil:

        Dim reader As System.IO.TextReader = New System.IO.StringReader(bla.responseText)
        Dim json = New Newtonsoft.Json.JsonTextReader(reader)
        Dim serializer As New Newtonsoft.Json.JsonSerializer

        Dim result = serializer.Deserialize(json)

A myslim ze jsem uz ziskal objekt s mymi daty.

Problem je ze nemam potuchy jak se dostat k jednotlivym vlastnostem tohoto objektu. Z prikladu (ktere jsou ovsem pouze na ASP) jsem tak nejak pochopil ze bych si mel nejak predpripravit strukturu do ktere pak jakoby nahraju ten objekt. Jak na to ale zase netusim :).

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Rozumím Vám, taky mám tenhle pocit ohledně XML/JSON.

Já osobně používám jinou knihovnu:

http://json.codeplex.com/

Serializace a deserializace je jednoduchá záležitost:

http://james.newtonking.com/projects/jso...

Příklad v C#:

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string output = JsonConvert.SerializeObject(product);

//{
//  "Name": "Apple",
//  "Expiry": "\/Date(1230375600000+1300)\/",
//  "Price": 3.99,
//  "Sizes": ["Small", "Medium", "Large"]
//}

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(output);

RA

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím,

vypadá to dobře, příklad se mi povedlo převést do VB.NET takhle:

Dim row As New RowClass
        row.cosi = 5
        row.neco = 2000
        row.line = "blablablabla"
        
Dim output As String = Newtonsoft.Json.JsonConvert.SerializeObject(row)
Dim newRow As RowClass = Newtonsoft.Json.JsonConvert.DeserializeObject(output)

Serializace se zdařila, ta je v pořádku, ale deserializace hlásí chybu ve stylu že Json.Linq.JObject nelze přetypovat na RowClass.

Prikladam jeste deklaraci Tridy RowClass

Public Class RowClass
    Public cosi As Long
    Public neco As Long
    Public line As String
End Class

Syntaxi ASP neznam ale doufam ze jsem to prepsal spravne.

Diky za pomoc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

S tímto problémem se budete muset obrátit na specializovanější fórum, nejde o součást .NET FW a Newtonsoft bude mít jistě vlastní support, tam Vám poradí lidé znalejší daného produktu než já.

RA

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

asi máte pravdu. Ale já jsem zase trochu pokročil:

Dim output As String = Newtonsoft.Json.JsonConvert.SerializeObject(row)

Dim newRow = Newtonsoft.Json.JsonConvert.DeserializeAnonymousType(output, New RowClass)

MsgBox(newRow.neco)

A to už funguje! Trik je v metode DeserializeAnonymousType, ktere jako druhy argument predam objekt na ktery se napasuji data.

Problém ale nastává když potřebuju rozkódovat složitější strukturu. například:

{"1":{"klic1":"hodnota1", "klic2":"hodnota2"},

"2":{"klic1":"hodnota1", "klic2":"hodnota2"}}

}

A na to uz moje jednoducha trida nestaci. Otazka tedy zni: Lze udelat ve VB neco jako viceurovnovy objekt? Ze by se k nemu treba pristupoval nejak takhle:

row(1).klic1 a nebo row(2).klic2

Diky za pomoc, bez Vas bych byl ztracenej :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano jistě, děděním z IEnumerable(T), ale tohle by měla umět ta Vaše knihovna sama o sobě, jestli nezvládá složitější zápisy JSONu rozkódovat, pak mi přijde, že bude lepší napsat si něco sám. S když uděláte objekt, jehož některá z vlastností je pole, jak to ta knihovna seserializuje? Měla by to umět deserializovat zase jako objekt s vlastností která je pole a naplnit to pole...

RA

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

tak už jsem na to konečně přišel:

Dim o As Newtonsoft.Json.Linq.JObject = Newtonsoft.Json.Linq.JObject.Parse(json_string)

Dim value As Newtonsoft.Json.Linq.JObject
        Dim klic1 As String
        Dim klic2 As String

For Each element In o
            value = element.Value
            klic1 = value("klic1")
            klic2 = value("klic2")
            MsgBox(klic2)
Next

Asi jsem v tom hledal az moc slozitosti. Díky za pomoc ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nemáte za co, rád pomohu :)

RA

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nechcete se přímo připojovat k databázi, aby nemuselo být uloženo heslo na klientských počítačích, hm. A jak tedy hodláte řešit autentizaci uživatelů přes to API?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ted Vas uplne nechapu. V aplikaci bude natvrdo ulozeno jenom API Secret, coz bude dlouhy kod generovany zvlast pro kazdou api, takze kdyby ho nahodou nekdo objevil, docilil by akorat toho ze by svou aplikaci mohl vydavat za tu moji, kdezto kdyby mi nekdo ukradl heslo od databaze tak by mi ji mohl taky celou smazat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback