If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

 
Go Back  dBforums > PC based Database Applications > FileMaker > FileMaker and VB.NET integration

Reply
 
LinkBack Thread Tools Display Modes
  #1 (permalink)  
Old 12-16-08, 12:07
amberdextrous amberdextrous is offline
Registered User
 
Join Date: Dec 2008
Posts: 3
FileMaker and VB.NET integration

Hello all, I'm a new member and I hope you can help me.

I am an IS intern and I am very new to Visual Basic, very, VERY new. I guess you could say I'm self-teaching myself on the job, but I am taking a class next semester. Anyway, my company uses two FileMaker systems that integrate. When you click "Create ID" in the first app, it takes you to the second app, you fill out all the details there, hit "Assign ID", it saves the record and it then takes you back to the first app (where it populates that field with the ID you just created). So basically, the ID in the first app is like a foreign key, and to see all the details you have to go to the second app.

My company has contracted another company to develop a .NET solution to replace the first app. The only problem is that now, we'll need to integrate the .NET solution with the second app (which is FileMaker). My manager would like to develop a sort of "middle man" web service. When the user clicks the "Create ID" in the .NET app, the data will be sent to the web service as XML, the web service will parse the XML and translate it into FileMaker schema, and then send it on its way to the FileMaker app. The new FileMaker record will then be pre-populated with all the info that was sent from the .NET app. He said HTTP GET and POST will need to be utilized for this to work.

Now like I said, I'm new to all this and trying to learn it. I made a sample GET function just to practice with the concepts:

Code:
<WebMethod()> _
    Public Function GetWebPageHtml() As String
        Dim url As String
        Dim request As HttpWebRequest
        Dim response As HttpWebResponse
        Dim responseStream As StreamReader
        Dim htmlAsString As String

        url = "http://www.google.com"
        ' Establish the request 
        request = WebRequest.Create(url)
        request.Method = "GET"

        'Retrieve request info headers
        response = request.GetResponse()
        responseStream = New StreamReader(response.GetResponseStream())
        htmlAsString = responseStream.ReadToEnd()
        Return htmlAsString

        response.Close()
        responseStream.Close()
    End Function
And it retrieved the HTML of Google's main page. But I am unsure as to how to POST a new record to the web-enabled FileMaker DB. Right now I'm using a test database. I know I must use a query string something like this:
Code:
http://localhost:8888/FMPro?-db=TABLENAME.fp5&-lay=web&-format=-fmp_xml&field1=value1&field2=value2&-new
But for now, just to take things one step at a time, I've been trying to pass a query string that will just search the records and return the XML for them. But I cannot even get that to work so I must be doing something wrong. This is the query I'm using:
Code:
http://localhost:8888/FMPro?-db=TABLENAME.fp5&-format=-dso_xml&field3=value3&-find
When I type it directly into the browser it works, but I get a HTTP 500 error when I run the VB debugger. Here is the code I have for my sample function:
Code:
<WebMethod()> _
    Public Function Find()
        Dim request As HttpWebRequest
        Dim response As HttpWebResponse
        Dim path As String
        Dim responseStream As StreamReader
        Dim responseText As String
        
        path = "http://localhost:8888/FMPro?-db=TABLENAME.fp5&-format=-dso_xml&field3=value3&-find"
        request = WebRequest.Create(path)
        request.Method = "GET"

        response = request.GetResponse()
        responseStream = New StreamReader(response.GetResponseStream())
        responseText = responseStream.ReadToEnd()
        Return responseText
    End Function
There IS a password on the test DB, but I always log into the DB first in FileMaker Pro in order to open the port and enable web sharing. Do I still need to provide a password in my code, and if so, how? Use the credentials property of HttpWebRequest? When I paste the query string directly into the browser, it asks me for the password the first time but not susbequent times. Also, I believe in production the FileMaker database will always be logged in on the server (this would be necessary for the web companion to work, right?)

I would be eternally grateful if someone could shed some light on what I'm trying to learn/do, that is, tell me why my Find function isn't working and how to post a new record using a query string in VB. If I know how to post a new record in this hard-coded query string fashion, I can figure out how to factor in the XML part to pass parameters to the query string...but as it stands right now I can't get anything else working until I get this working.

Thanks!
Reply With Quote
  #2 (permalink)  
Old 12-17-08, 14:39
amberdextrous amberdextrous is offline
Registered User
 
Join Date: Dec 2008
Posts: 3
Asp.net, Vb, Get/post

Let me clarify...this is an ASP.NET web service.

I got my Find function working, and I am now able to run queries against the database using HTTP GET and the results are returned to me as XML. However, I am still having a problem with adding new records. I can add a new record with GET, but not POST. From my understanding, URIs have a length limit, and I've read that POST can be used in place of GET to avoid this limitation. I tried implementing a POST function based on sample code I saw, but I have a feeling I did it completely wrong. Like I said, I'm new to web services so forgive me.

This code works:

Code:
<WebMethod()> _
    Public Function Find() As String
        Dim uri As New Uri("http://localhost:8888/FMPro?-db=TABLENAME.fp5&-format=-dso_xml&field1=value1&-find")
        Dim credentials As NetworkCredential

        If (uri.Scheme = uri.UriSchemeHttp) Then
            Dim request As HttpWebRequest = HttpWebRequest.Create(uri)
            credentials = New NetworkCredential("", "password")
            request.Credentials = credentials
            request.Method = WebRequestMethods.Http.Get
            Dim response As HttpWebResponse = request.GetResponse()
            Dim reader As New StreamReader(response.GetResponseStream())
            Dim xml As String = reader.ReadToEnd()
            response.Close()
            Return xml
        End If
    End Function
And this code works:

Code:
<WebMethod()> _
<WebMethod()> _
    Public Function AddRecordWithHTTPGet() As String
        Dim uri As New Uri("http://localhost:8888/FMPro?-db=TABLENAME.fp5&-format=-fmp_xml&field2=value2&-new")

        Dim credentials As NetworkCredential

        If (uri.Scheme = uri.UriSchemeHttp) Then
            Dim request As HttpWebRequest = HttpWebRequest.Create(uri)
            credentials = New NetworkCredential("", "password")
            request.Credentials = credentials
            request.Method = WebRequestMethods.Http.Get
            Dim response As HttpWebResponse = request.GetResponse()
            Dim reader As New StreamReader(response.GetResponseStream())
            Dim xml As String = reader.ReadToEnd()
            response.Close()
            Return xml
        End If
    End Function
This code DOESN'T work:

Code:
<WebMethod()> _
    Public Function AddRecordWithHTTPPost()
        ' I get a "Format file not found" error:
        Dim uri As New Uri("http://localhost:8888/FMPro?-db=TABLENAME.fp5&-format=-fmp_xml&-lay=webdown")
        Dim param1 As String = "field3=value3&-new"

        Dim credentials As NetworkCredential

        If uri.Scheme = uri.UriSchemeHttp Then
            Dim request As HttpWebRequest = HttpWebRequest.Create(uri)
            credentials = New NetworkCredential("", "password")
            request.Credentials = credentials
            request.Method = WebRequestMethods.Http.Post
            request.ContentLength = param1.Length
            request.ContentType = "application/x-www-form-urlencoded"

            Dim writer As New StreamWriter(request.GetRequestStream)
            writer.Write(param1)
            writer.Close()

            Dim oResponse As HttpWebResponse = request.GetResponse()
            Dim reader As New StreamReader(oResponse.GetResponseStream())
            Dim xml As String = reader.ReadToEnd()
            oResponse.Close()
            Return xml
        End If

    End Function
I think I read somewhere that adding FileMaker records can only be done with GET. Yet, when I view the web-enabled database in the browser and click "New record", a blank form comes up and when I left-click and select "View source code", FORM METHOD=POST is in the code. So there must be a way to do it in ASP.NET. Does anyone know how?
Reply With Quote
  #3 (permalink)  
Old 12-23-08, 12:27
amberdextrous amberdextrous is offline
Registered User
 
Join Date: Dec 2008
Posts: 3
Nevermind, I figured out how to perform the POST. The problem was with the URI. I did not have it formatted correctly...I didn't know the URI can only contain up to the question mark, and everything else must be contained in the POST body. I also found that even though my FM database has only a password (no username), I had to include a dummy username in the credentials, otherwise I could not authenticate. As long as I had at least one character in place of "username" it would work.

Thought I'd share in case anyone else ever runs into this problem.
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On