C# 如何使用Json从web API传递url?

C# 如何使用Json从web API传递url?,c#,windows-phone-8.1,json.net,asp.net-web-api,C#,Windows Phone 8.1,Json.net,Asp.net Web Api,我使用jsontocsharp在线转换器转换了两个api扩展。通过第一个API,这些类用于在单击按钮时搜索特定的书籍。在文本框中输入后,将显示项目列表。当用户点击一本书时,它会通过一个下载按钮导航到另一个页面。第二个api类显示了本书的详细信息 我可以成功显示搜索项目并在下一页中显示它们。但是如何从类中使用此下载属性并将其链接到所选书籍。因此,当用户单击下载选项时,它应该被导航到web浏览器并下载相应的文件 我正在使用它的电子书api。请参考此链接以获取有关api的详细信息 [![在此处输入图像

我使用jsontocsharp在线转换器转换了两个api扩展。通过第一个API,这些类用于在单击按钮时搜索特定的书籍。在文本框中输入后,将显示项目列表。当用户点击一本书时,它会通过一个下载按钮导航到另一个页面。第二个api类显示了本书的详细信息

我可以成功显示搜索项目并在下一页中显示它们。但是如何从类中使用此下载属性并将其链接到所选书籍。因此,当用户单击下载选项时,它应该被导航到web浏览器并下载相应的文件

我正在使用它的电子书api。请参考此链接以获取有关api的详细信息

[![在此处输入图像描述][4][4] 我应该在下一页显示标题和描述。所以我在新页面中绑定了listview控件。我还应该下载所选书籍的书籍

我得到了下面的例外 [![在此处输入图像描述][5][5]


使用listview SelectedIndexChanged事件处理程序了解所选项目,然后将每个项目转换为Book对象。由于要将列表书本指定给列表视图,因此可以提取单个书本对象。请参见代码中的注释

private long bookid;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    dynamic bookDetails = e.Parameter;
    bookid = bookDetails.ID;
}

    private async void download_btn_Click(object sender, RoutedEventArgs e)
{
    using (HttpClient client = new HttpClient())
    {
        var id = bookid;

        var uri = "http://it-ebooks-api.info/v1/book/"+id;

       //Here I should implement some code to convert from json to simple download url
        await Launcher.LaunchUriAsync(new Uri(uri));

    }

我假设您将把图书id从搜索列表页面传递到图书详细信息页面

     //Class for book details

    public class BookDetails
    {
      private string Error {get; set;}
      private string Time {get; set;}
      private string ID {get; set;}
      private string Title {get; set;}
      private string SubTitle {get; set;}
      private string Description {get; set;}
      private string Author {get; set;}
      private string ISBN {get; set;}
      private string Year {get; set;}
      private string Page {get; set;}
      private string Publisher {get; set;}
      private string Image {get; set;}
      private string Download {get; set;}
    }

    private async void download_btn_Click(object sender, RoutedEventArgs e)
    {
        string downloadbookurl=string.empty;

       //Download the book detail using API http://it-ebooks-api.info/v1/book/2279690981
         string result=GetResult("http://it-ebooks-api.info/v1/book{book_isbn}")
       //Deserialise the json data
         BookDetails bookDetails= JsonConvert.DeserializeObject<BookDetails >(result);
         if(bookDetails!=null)
                downloadbookurl=bookDetails.Download ;

         }
          //Launch the webview
                 await Launcher.LaunchUriAsync(new Uri(downloadbookurl));
    }

    private async string GetResult(string url)
    {
         string response=string.empty;
         using (HttpClient client = new HttpClient())
         {
           client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
           HttpResponseMessage response = await client.GetAsync(String.Format(uri, tb1.Text));
           if (response.IsSuccessStatusCode)
           {
             var data = response.Content.ReadAsStringAsync();
             response=data.Result.ToString();
            }
         } 
    }

lv1是什么类型的组件?是listview吗?是的listview。此下载事件位于新页面,谢谢您的回复。我的主要问题是上面的代码在第一页。因此,当我单击所选项目时,页面将进行导航。我用e.parameter显示了这本书的细节。下载按钮在第二页。如何在新页面中显示该书的特定id您可以显示如何导航到第二页的代码吗?我在想,您可以做的是在导航到下一页之前提取该对象,并将该对象作为param-PhoneApplicationService.Current.State[yourparam]=param`private void lv1\u SelectionChangedobject sender传递,SelectionChangedEventArgs e{lv1.SelectedItem=sender;this.Frame.NavigatetypeofBlankPage1,lv1.SelectedItem;}`我更新了上面的答案,请现在再试一次,看看它是否适合您。我对Windows Phone开发不太熟悉,但应该非常熟悉。async的返回类型应该是void,但它是string。如何使用HttpClient=new HttpClient删除此错误私有异步字符串GetResultstring url{string response=string.empty;应如何删除此错误私有异步字符串GetResultstring url{string response=string.empty{client.DefaultRequestHeaders.Accept.Addnew System.Net.Http.Headers.MediaTypeWithQualityHeaderValueapplication/json;HttpResponseMessageResponse=Wait client.GetAsyncString.Formaturi,tb1.Text;if response.IsSuccessStatusCode{var data=response.Content.ReadAsStringAsync;response=data.Result.ToString;}}}return response;}来自GetResult函数的返回响应参数当我调试代码时,返回类型应该是tasksw,它显示Uri为空。未将链接即Result传递给启动器
private long bookid;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    dynamic bookDetails = e.Parameter;
    bookid = bookDetails.ID;
}

    private async void download_btn_Click(object sender, RoutedEventArgs e)
{
    using (HttpClient client = new HttpClient())
    {
        var id = bookid;

        var uri = "http://it-ebooks-api.info/v1/book/"+id;

       //Here I should implement some code to convert from json to simple download url
        await Launcher.LaunchUriAsync(new Uri(uri));

    }
     //Class for book details

    public class BookDetails
    {
      private string Error {get; set;}
      private string Time {get; set;}
      private string ID {get; set;}
      private string Title {get; set;}
      private string SubTitle {get; set;}
      private string Description {get; set;}
      private string Author {get; set;}
      private string ISBN {get; set;}
      private string Year {get; set;}
      private string Page {get; set;}
      private string Publisher {get; set;}
      private string Image {get; set;}
      private string Download {get; set;}
    }

    private async void download_btn_Click(object sender, RoutedEventArgs e)
    {
        string downloadbookurl=string.empty;

       //Download the book detail using API http://it-ebooks-api.info/v1/book/2279690981
         string result=GetResult("http://it-ebooks-api.info/v1/book{book_isbn}")
       //Deserialise the json data
         BookDetails bookDetails= JsonConvert.DeserializeObject<BookDetails >(result);
         if(bookDetails!=null)
                downloadbookurl=bookDetails.Download ;

         }
          //Launch the webview
                 await Launcher.LaunchUriAsync(new Uri(downloadbookurl));
    }

    private async string GetResult(string url)
    {
         string response=string.empty;
         using (HttpClient client = new HttpClient())
         {
           client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
           HttpResponseMessage response = await client.GetAsync(String.Format(uri, tb1.Text));
           if (response.IsSuccessStatusCode)
           {
             var data = response.Content.ReadAsStringAsync();
             response=data.Result.ToString();
            }
         } 
    }