2017-02-21 151 views
1

我在使用Xamarin Android(MvvmCross)从我的Android应用程序发送发送JSON数据时遇到问题。Xamarin Android客户端发布JSON到节点JS web服务

Android应用程序中的函数可以毫无例外地运行;但是,我的Web服务(使用Express编写的Node JS)似乎未检测到其端点上的发布请求。请注意,使用get(将Web服务中的数据发送到Android应用)的其他终端正在运行。

下面是我的功能,我的数据发布到我的web服务

public async Task<int> insertSales(IEnumerable<Models.SalesTable> newsales) 
    { 
     /*ServerDatabaseApi.insertSalesEndpoint = "http://" + ipAddress + ":" + port + 
     "/insertsales";*/ 
     WebRequest request = WebRequest.CreateHttp(ServerDatabaseApi.insertSalesEndpoint); 
     request.Method = "POST"; 
     request.ContentType = "application/json"; 
     try 
     { 
      using (var streamwriter = new StreamWriter(await request.GetRequestStreamAsync())) 
      { 
       string json = JsonConvert.SerializeObject(newsales, Formatting.Indented); 
       streamwriter.Write(json); 
       streamwriter.Flush(); 
      } 
      return 1; 
     } 
     catch (WebException we) 
     { 
      return 0; 
     } 
    } 

当运行上面的功能,它总是成功的(return 1;始终执行)。我也尝试检查JSON序列化,它工作得很好。

下面还附加了用于提供数据的端点代码。

/*endpoint for inserting a new sales to sales table*/ 
app.post('/insertsales', function(appReq, appRes){ 
    console.log("Insert sales; count : "+ appReq.body.length); 
    sql.connect(conn).then(function(){ 
     console.log("Insert sales; count : "+ appReq.body.length); 
     for (var i = 0 ; i < appReq.body.length ; i++) { 
      new sql.Request() 
      .query("insert into SalesTable " + 
      "values  ('"+appReq.body[i].DocumentNo+"','"+appReq.body[i].DateCreated+"','"+appReq.body[i].Location+"',"+ 
      appReq.body[i].TotalDiscountAmount+","+appReq.body[i].Total+",'"+appReq.body[i].SalesmanId+"','"+ 
      appReq.body[i].CustomerId+"',"+appReq.body[i].Latitude+","+appReq.body[i].Longitude+")") 
     .catch(function(err){ 
      console.log(err); 
      }); 
     } 
    }).catch(function(err){ 
     console.log(err); 
    }); 
}); 

我试图用console.log来追踪它是否到达终点。但是,它从不执行。

你能帮我找出我出错的地方吗?提前致谢。

回答

1

您的.NET代码中没有任何内容实际上发送WebRequest。你创建请求,写一些JSON到它的流中,然后刷新它。这里有一个简单的方法来使网络通话(未经测试):

public async Task<int> InsertSales(IEnumerable<Models.SalesTable> newSales) 
{ 
    var ipAddress = "";// your IP address here 
    var port = ""; // your port here 
    var endpoint = $"http://{ipAddress}:{port}/insertsalesline"; 
    var requestString = JsonConvert.SerializeObject(newSales); 
    var content = new StringContent(requestString, Encoding.UTF8, "application/json"); 

    using (var client = new HttpClient()) 
    { 
     var reponse = await client.PostAsync(endpoint, content); 
     if (reponse.IsSuccessStatusCode) 
      return 1; 
     else 
      return 0; 
    } 
} 
+0

嗨卢克,感谢您的帮助和解释!基于http://stackoverflow.com/a/10027534/5023889答案,起初我以为'.Flush'已经发送了'WebRequest'。 –