RESTing Fez Raptor

Just been playing with the Fez Raptor connecting to a Azure Website running ASP.NET WebAPI 2.

It makes use of the Json.NETMF nuget package.

It uses HTTP Get

    Private Function HttpGet(url As String) As Boolean
        ' Set up a 64k buffer to hold result stream from web request.
        Dim result As Byte() = New Byte(65536) {}
        Dim read As Integer = 0
        Dim resultString As String = ""
        Debug.Print("About to HttpPGet to: " & url)
        Using req As WebRequest = HttpWebRequest.Create(url)
            _led.TurnGreen()
            ' Say we want json back and UTF8 character set.
            req.ContentType = "application/json; charset=utf-8"
            Try
                Using res = req.GetResponse()
                    Using readStream = res.GetResponseStream
                        Do
                            ' Read the response
                            read = readStream.Read(result, 0, result.Length)
                            ' Convert to string
                            Dim bit As New String(Encoding.UTF8.GetChars(result))
                            resultString &= bit
                            result = New Byte(65536) {}
                        Loop While read <> 0
                    End Using
                End Using
            Catch ex As Exception
                _debugDisplay.DebugMessage("HttpGet", "Failed")
                Debug.Print(ex.Message)
                _led.TurnOff()
                Return False
            End Try
            _led.TurnOff()
        End Using
        Try
            _result = CType(JsonSerializer.DeserializeString(resultString), Hashtable)
        Catch ex As Exception
            _debugDisplay.DebugMessage("Json Deserialize", "Failed")
            Debug.Print(ex.Message)
        End Try
        Return True
    End Function

And HTTP Post

    Private Function HttpPost(uri As String, body As String) As Boolean
        Dim result As Byte() = New Byte(65536) {}
        Dim read As Integer = 0
        Dim resultString As String = ""
        Debug.Print("About to HttpPost to: " & uri)
        Using req As WebRequest = HttpWebRequest.Create(uri)
            ' Say we want json back and UTF8 character set.
            _led.TurnBlue()
            req.ContentType = "application/json; charset=utf-8"
            req.Method = "POST"
            Dim bits As Byte() = Encoding.UTF8.GetBytes(body)
            req.ContentLength = bits.Length
            Try
                Using outStream = req.GetRequestStream
                    outStream.Write(bits, 0, bits.Length)
                End Using
                Using res = req.GetResponse()
                    Using readStream = res.GetResponseStream
                        Do
                            ' Read the response
                            read = readStream.Read(result, 0, result.Length)
                            ' Convert to string
                            Dim bit As New String(Encoding.UTF8.GetChars(result))
                            resultString &= bit
                            result = New Byte(65536) {}
                        Loop While read <> 0
                    End Using
                End Using
            Catch ex As Exception
                _debugDisplay.DebugMessage("HttpPost", "Failed")
                Debug.Print(ex.Message)
                _led.TurnOff()
                Return False
            End Try
            _led.TurnOff()
        End Using
        Try
            _result = CType(JsonSerializer.DeserializeString(resultString), Hashtable)
        Catch ex As Exception
            _debugDisplay.DebugMessage("Json Deserialize", "Failed")
            Debug.Print(ex.Message)
        End Try
        Return True
    End Function

Basically, the json returned is converted into a hash table and I just try to pull the messages out of it.

The server end is:

Imports System.Net
Imports System.Web.Http
Imports System.Net.Http

Namespace Controllers
    Public Class UserController
        Inherits ApiController

        ' GET: api/User
        'Public Function GetValues() As IEnumerable(Of String)
        '    Return New String() {"value1", "value2"}
        'End Function

        ' GET: api/User/{code}
        Public Function GetValue(id As String, z As String) As UserResponse
            Trace.WriteLine("Entered GetValue")
            Dim response As New UserResponse
            Dim usr As User = GetUserById(id)
            If usr Is Nothing Then
                response.success = False
                response.token = "register"
                response.message = "Need to Register"
            Else
                If usr.Pin = z Then
                    response.success = True
                    Dim tkn As String = GetToken(usr.Id)
                    If tkn Is Nothing Then
                        response.success = False
                        response.token = ""
                        response.message = "Failed to get token"
                    Else
                        response.token = tkn
                        response.message = usr.Name
                    End If
                Else
                    response.success = False
                    response.token = ""
                    response.message = "Login Failed"
                End If
            End If
            Return response
        End Function

        ' POST: api/User
        Public Function PostValue(<FromBody()> ByVal usr As RegisterUser) As HttpResponseMessage
            If RegisterUser(usr) = False Then
                Return New HttpResponseMessage(HttpStatusCode.Forbidden)
            Else
                Return New HttpResponseMessage(HttpStatusCode.OK)
            End If
        End Function

        '' PUT: api/User/5
        'Public Sub PutValue(ByVal id As Integer, <FromBody()> ByVal value As String)

        'End Sub

        '' DELETE: api/User/5
        'Public Sub DeleteValue(ByVal id As Integer)

        'End Sub

        Private Function GetUserById(id As String) As User
            Dim db As New TyranntDataContext

            Dim q = From u In db.Users
                    Where u.RFKey = id
                    Select u

            If q.Count <> 1 Then
                Return Nothing
            Else
                Return q.Single
            End If
        End Function

        Private Function GetToken(id As String) As String
            Dim db As New TyranntDataContext

            Dim usr = From u In db.Users
                      Where u.Id = id
                      Select u
            If usr.Count = 0 Then
                ' Return nothin as user doesnt exist
                Return ""
            Else
                Dim u = usr.Single
                Dim q = From t In db.Tokens
                            Where t.user.Id = u.Id
                            Select t

                If q.Count = 0 Then
                    ' There is no token so create one
                    Dim t As New Token
                    t.user = u
                    t.token = Guid.NewGuid.ToString
                    t.lastUsed = DateTime.Now
                    db.Tokens.Add(t)
                    db.SaveChanges()
                    Return t.token
                Else
                    ' We have one, lets create a new token.
                    Dim t As Token = q.Single
                    t.token = Guid.NewGuid.ToString
                    t.lastUsed = DateTime.Now
                    db.SaveChanges()
                    Return t.token
                End If
            End If
        End Function

        Private Function RegisterUser(usr As RegisterUser) As Boolean
            Dim newUser As New User
            newUser.Name = usr.UserName
            newUser.RFKey = usr.UserID
            newUser.Pin = usr.Pin

            ' Check if user already exists
            Dim chkUser As User = GetUserById(usr.UserID)

            ' If no user is returned then we are ok to proceed
            If chkUser Is Nothing Then
                ' Great. User doesn't exist so we try to add a new one.
                Try
                    Dim db As New TyranntDataContext
                    db.Users.Add(newUser)
                    db.SaveChanges()
                Catch ex As Exception
                    Trace.WriteLine("RegisterUserFailed:" & ex.Message, "Error")
                    Return False
                End Try
                Return True
            Else
                ' Naughty, user already exists so we return false.
                Return False
            End If
        End Function
    End Class
End Namespace

11 Likes