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