2012-10-11 32 views
2

我需要從我的asp.ner mvc web應用程序調用BPM引擎的JSON API。 API調用的BPM被構造爲如下: -從我的控制器調用JSON API而不是從我的asp.net mvc web應用程序中的視圖

http://localhost:8080/jw/web/json/workflow/process/list?j_username=kermit&hash=9449B5ABCFA9AFDA36B801351ED3DF66&loginAs=' + username 

其中兩個所述j_user &散列paramertes表示被設定在BPM發動機側的主登錄用戶名和密碼。 目前我使用的Java /腳本在視圖級別從我的asp.net mvc的調用API: -

$(document).ready(function() { 
    var fullurl = 'http://localhost:8080/jw/web/json/workflow/package/list?j_username=kermit&hash=9449B5ABCFA9AFDA36B801351ED3DF66&loginAs=' + username ; 
    $.ajax({ 
     type: "GET", 
     url: fullurl, 

     dataType: "JSONP", 
     // contentType: "application/json; charset=utf-8", 
     success: function (result) { 

      $.each(result.data, function (key, val) { 

       // Format the text to display. 
      // var str = val.packageName + ' | ' + val.packageId; 
       var str = val.packageName ; 
       // Add a list item for the product. 
       $('<li/>', { text: str }) 
       .appendTo($('#products')); 

      }); 
     } 
    }); 


}); 

但有人告訴我,露出了主登錄的用戶名都和密碼,也LoginAS其用戶名錶示登錄用戶在asp.net mvc的用戶名是不安全的,而且我應該在服務器端執行API調用,以避免從JAVASCRIPT調用API。

但我的問題是我如何將上述代碼轉換爲從mvc控制器端接收JSON,然後將JSON傳遞給視圖? 問候

+1

因爲我在短時間內感到困惑,所以只是提起術語。視圖通常也在服務器上呈現。在MVC體系結構中,所有M,V,C都在服務器上執行。 「從服務器執行呼叫,而不是客戶端」本來會更精確。 –

回答

6

你可以使用一個WebClient火HTTP請求到指定的網址:

public class PackagesController: Controller 
{ 
    public ActionResult List() 
    { 
     using (var client = new WebClient()) 
     { 
      var query = HttpUtility.ParseQueryString(string.Empty); 
      query["j_username"] = "kermit"; 
      query["hash"] = "9449B5ABCFA9AFDA36B801351ED3DF66"; 
      query["loginAs"] = "some_username"; 
      var url = new UriBuilder("http://localhost:8080/jw/web/json/workflow/package/list"); 
      url.Query = query.ToString(); 
      string json = client.DownloadString(url.ToString()); 
      return Content(json, "application/json"); 
     } 
    } 
} 

,或者你可以使用新的HttpClient介紹.NET 4.5:

public class PackagesController : AsyncController 
{ 
    public async Task<ActionResult> ListPackages() 
    { 
     using (var client = new HttpClient()) 
     { 
      var query = HttpUtility.ParseQueryString(string.Empty); 
      query["j_username"] = "kermit"; 
      query["hash"] = "9449B5ABCFA9AFDA36B801351ED3DF66"; 
      query["loginAs"] = "some_username"; 
      var url = new UriBuilder("http://localhost:8080/jw/web/json/workflow/package/list"); 
      url.Query = query.ToString(); 
      var response = await client.GetAsync(url.ToString()); 
      var result = await response.Content.ReadAsStringAsync(); 
      return Content(result, "application/json"); 
     } 
    } 
} 

和從你的javascript發送一個AJAX請求到上述動作:

<script type="text/javascript"> 
    $(document).ready(function() { 
     $.ajax({ 
      url: '@Url.Action("List", "Packages")', 
      type: 'GET', 
      cache: false, 
      success: function (result) { 
       $.each(result.data, function (key, val) { 
        var str = val.packageName; 
        $('<li/>', { text: str }) 
         .appendTo($('#products')); 
       }); 
      } 
     }); 
    }); 
</script> 
+0

感謝您的回覆,它部分工作。如果我手動導航到以下URL http:// localhost:1431/Home/ListPackages我會得到Json,但我認爲這個問題是該網址:'@ Url.Action(「ListPackages」,「Home」)'inside劇本不工作,但我不知道爲什麼? –

+0

這個腳本在你的視圖裏面嗎?或者它是在一個單獨的JavaScript文件中? –

+0

在一個單獨的js文件中 –

相關問題