Create, Update or Delete a User
In the third post we continue to use the fake online REST service to add operations to create, update and delete a user.
We add three DataOperation declarations to create, update and delete a user and set the OutputType to be JSON to easily show the request response in a textbox as a text string. The online service will return a correct response but no changes will actually be done in the service database, this is just for testing purposes.
<mashup:DataOperation Name="CreateUserPost"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/users" /> <mashup:DataParameter Key="REST.InputJsonTemplate" Value="{StaticResource PostTemplate}" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> <mashup:DataParameter Key="REST.HttpMethod" Value="POST" /> <mashup:DataParameter Key="REST.InputType" Value="json" /> <mashup:DataParameter Key="REST.OutputType" Value="application/json" /> </mashup:DataOperation> <mashup:DataOperation Name="UpdateUserPost"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/users/{id}" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> <mashup:DataParameter Key="REST.HttpMethod" Value="PUT" /> <mashup:DataParameter Key="REST.InputType" Value="json" /> <mashup:DataParameter Key="REST.OutputType" Value="application/json" /> </mashup:DataOperation> <mashup:DataOperation Name="DeleteUser"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/posts/{id}" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> <mashup:DataParameter Key="REST.HttpMethod" Value="DELETE" /> <mashup:DataParameter Key="REST.OutputType" Value="application/json" /> </mashup:DataOperation>
We also add a button for each operation with a trigger event. All the property values for the current item the DataPanel will be added in the request body, so just declare the Parameter bindings for values that may change.
<Button DockPanel.Dock="Right" HorizontalAlignment="Right" Margin="5" Content="Update User"> <Button.CommandParameter> <mashup:Events> <mashup:Event TargetName="UserDetails" SourceEventName="Click" TargetEventName="UpdateUserPost"> <mashup:Parameter TargetKey="email" Value="{Binding ElementName=CEmail, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="website" Value="{Binding ElementName=CWebsite, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="phone" Value="{Binding ElementName=CPhone, Path=Text}" Type="String" /> </mashup:Event> </mashup:Events> </Button.CommandParameter> </Button>
Here is the Mashup code if you would like to try it out.
<Grid Margin="15,10,15,15" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ui="clr-namespace:Mango.UI.Controls;assembly=Mango.UI" xmlns:mashup="clr-namespace:Mango.UI.Services.Mashup;assembly=Mango.UI" xmlns:m3="clr-namespace:MForms.Mashup;assembly=MForms" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <Grid.RowDefinitions> <RowDefinition Height="1*" /> <RowDefinition Height="Auto" /> <RowDefinition Height="1*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="1*" /> <ColumnDefinition Width="10" /> <ColumnDefinition Width="1*" /> </Grid.ColumnDefinitions> <Grid.Resources> <x:String x:Key="PostTemplate"><![CDATA[ { "name": "{name}", "username": "{username}", "email": "{email}", "address": { "street": "{street}", "suite": "{suite}", "city": "{city}", "zipcode": "{zipcode}", "geo": { "lat": "0.0", "lng": "0.0" } }, "phone": "{phone}", "website": "{website}", "company": { "name": "{companyName}", "catchPhrase": "{companyCatchPhrase}", "bs": "{companyBs}" } } ]]></x:String> </Grid.Resources> <mashup:DataListPanel DockPanel.Dock="Top" Name="UsersList" Grid.Column="0" Grid.Row="0" Grid.RowSpan="3"> <mashup:DataListPanel.DataService> <mashup:DataService Type="REST"> <mashup:DataService.Operations> <mashup:DataOperation Name="List"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/users/" /> <mashup:DataParameter Key="REST.OutputType" Value="DataItem" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> </mashup:DataOperation> </mashup:DataService.Operations> </mashup:DataService> </mashup:DataListPanel.DataService> <mashup:DataListPanel.Events> <mashup:Events> <mashup:Event SourceEventName="Startup" TargetEventName="List" /> <mashup:Event SourceName="UsersList" TargetName="UserDetails" SourceEventName="CurrentItemChanged" TargetEventName="Get"> <mashup:Parameter SourceKey="id" TargetKey="userId" Type="Numeric" /> </mashup:Event> </mashup:Events> </mashup:DataListPanel.Events> <DockPanel LastChildFill="False"> <ListView DockPanel.Dock="Top" Name="ListViewCompany" ItemsSource="{Binding Items}" Style="{DynamicResource styleListView}" ItemContainerStyle="{DynamicResource styleListViewItem}"> <ListView.View> <GridView ColumnHeaderContainerStyle="{DynamicResource styleGridViewColumnHeader}"> <GridView.Columns> <GridViewColumn Header="Company" DisplayMemberBinding="{Binding [company].[name]}" /> <GridViewColumn Header="City" DisplayMemberBinding="{Binding [address].[city]}" /> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding [name]}" /> <GridViewColumn Header="Email" DisplayMemberBinding="{Binding [email]}" /> <GridViewColumn Header="Longitude" DisplayMemberBinding="{Binding [address].[geo].[lng]}" /> <GridViewColumn Header="Longitude" DisplayMemberBinding="{Binding [address].[geo].[lng]}" /> </GridView.Columns> </GridView> </ListView.View> </ListView> </DockPanel> </mashup:DataListPanel> <mashup:DataPanel Grid.Row="0" Grid.Column="2" Grid.RowSpan="1" Name="UserDetails"> <mashup:DataPanel.DataService> <mashup:DataService Type="REST"> <mashup:DataService.Operations> <mashup:DataOperation Name="Get"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/users/{userId}" /> <mashup:DataParameter Key="REST.OutputType" Value="DataItem" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> </mashup:DataOperation> <mashup:DataOperation Name="CreateUserPost"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/users" /> <mashup:DataParameter Key="REST.InputJsonTemplate" Value="{StaticResource PostTemplate}" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> <mashup:DataParameter Key="REST.HttpMethod" Value="POST" /> <mashup:DataParameter Key="REST.InputType" Value="json" /> <mashup:DataParameter Key="REST.OutputType" Value="application/json" /> </mashup:DataOperation> <mashup:DataOperation Name="UpdateUserPost"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/users/{id}" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> <mashup:DataParameter Key="REST.HttpMethod" Value="PUT" /> <mashup:DataParameter Key="REST.InputType" Value="json" /> <mashup:DataParameter Key="REST.OutputType" Value="application/json" /> </mashup:DataOperation> <mashup:DataOperation Name="DeleteUser"> <mashup:DataParameter Key="REST.BaseAddress" Value="https://jsonplaceholder.typicode.com/posts/{id}" /> <mashup:DataParameter Key="REST.AcceptHeader" Value="application/json" /> <mashup:DataParameter Key="REST.HttpMethod" Value="DELETE" /> <mashup:DataParameter Key="REST.OutputType" Value="application/json" /> </mashup:DataOperation> </mashup:DataService.Operations> </mashup:DataService> </mashup:DataPanel.DataService> <mashup:DataPanel.Events> <mashup:Events></mashup:Events> </mashup:DataPanel.Events> <Grid Margin="10,0,10,0"> <Grid.RowDefinitions> <RowDefinition Height="50" /> <RowDefinition Height="Auto" /> <RowDefinition Height="0" /> <RowDefinition Height="Auto" /> <RowDefinition Height="0" /> <RowDefinition Height="Auto" /> <RowDefinition Height="0" /> <RowDefinition Height="Auto" /> <RowDefinition Height="0" /> <RowDefinition Height="Auto" /> <RowDefinition Height="24" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <DockPanel Grid.Row="1" LastChildFill="False"> <TextBlock DockPanel.Dock="Left" Text="Company" Width="55" Margin="5" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CCompany" Width="220" Margin="5" Text="{Binding [company].[name]}" /> </DockPanel> <DockPanel Grid.Row="3"> <TextBlock DockPanel.Dock="Left" Text="Name" Width="55" Margin="5" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CName" Width="220" Margin="5" Text="{Binding [name]}" /> <TextBlock DockPanel.Dock="Left" Text="UserName" Width="60" Margin="0,0,10,0" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CUserName" Margin="5" Text="{Binding [username]}" /> </DockPanel> <DockPanel Grid.Row="5"> <TextBlock DockPanel.Dock="Left" Text="Email" Width="55" Margin="5" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CEmail" Width="220" Margin="5" Text="{Binding [email]}" /> <TextBlock DockPanel.Dock="Left" Text="Website" Width="60" Margin="0,0,10,0" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CWebsite" Margin="5" Text="{Binding [website]}" /> </DockPanel> <DockPanel Grid.Row="7" LastChildFill="False"> <TextBlock DockPanel.Dock="Left" Text="Phone" Width="55" Margin="5" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CPhone" Width="220" Margin="5" Text="{Binding [phone]}" /> </DockPanel> <DockPanel Grid.Row="9"> <TextBlock DockPanel.Dock="Left" Text="Catch" Width="55" Margin="5" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CCatch" Width="220" Margin="5" Text="{Binding [company].[catchPhrase]}" /> <TextBlock DockPanel.Dock="Left" Text="BS" Width="60" Margin="5" VerticalAlignment="Center" /> <TextBox DockPanel.Dock="Left" Name="CBS" Margin="5" Text="{Binding [company].[bs]}" /> </DockPanel> <DockPanel Grid.Row="11"> <Button DockPanel.Dock="Right" HorizontalAlignment="Right" Margin="5" Content="Add User"> <Button.CommandParameter> <mashup:Events> <mashup:Event TargetName="UserDetails" SourceEventName="Click" TargetEventName="CreateUserPost"> <mashup:Parameter TargetKey="name" Value="{Binding ElementName=CName, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="companyName" Value="{Binding ElementName=CCompany, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="userName" Value="{Binding ElementName=CUserName, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="email" Value="{Binding ElementName=CEmail, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="website" Value="{Binding ElementName=CWebsite, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="phone" Value="{Binding ElementName=CPhone, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="companyCatchPhrase" Value="{Binding ElementName=CCatch, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="companyBs" Value="{Bindng ElementName=CBS, Path=Text}" Type="String" /> </mashup:Event> </mashup:Events> </Button.CommandParameter> </Button> <Button DockPanel.Dock="Right" HorizontalAlignment="Right" Margin="5" Content="Update User"> <Button.CommandParameter> <mashup:Events> <mashup:Event TargetName="UserDetails" SourceEventName="Click" TargetEventName="UpdateUserPost"> <mashup:Parameter TargetKey="email" Value="{Binding ElementName=CEmail, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="website" Value="{Binding ElementName=CWebsite, Path=Text}" Type="String" /> <mashup:Parameter TargetKey="phone" Value="{Binding ElementName=CPhone, Path=Text}" Type="String" /> </mashup:Event> </mashup:Events> </Button.CommandParameter> </Button> <Button DockPanel.Dock="Top" HorizontalAlignment="Right" Margin="5" Content="Delete User"> <Button.CommandParameter> <mashup:Events> <mashup:Event TargetName="UserDetails" SourceEventName="Click" TargetEventName="DeleteUser"> <mashup:Parameter TargetKey="id" Value="{Binding ElementName=UsersList, Path=CurrentItem[id]}" /> </mashup:Event> </mashup:Events> </Button.CommandParameter> </Button> </DockPanel> </Grid> </mashup:DataPanel> <DockPanel Grid.Row="1" Grid.Column="2" Grid.RowSpan="2" VerticalAlignment="Stretch"> <TextBlock DockPanel.Dock="Top" Text="Server Response:" Width="140" Margin="5" VerticalAlignment="Top" HorizontalAlignment="Left" /> <TextBox Name="ServerResponse" DockPanel.Dock="Top" Text="{Binding ElementName=UserDetails, Path=DataContext[json]}" Margin="5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Top" TextWrapping="Wrap" AcceptsReturn="True" /> </DockPanel> </Grid>