从我的控制器调用JSON API,而不是从我的asp.net mvc Web应用程序中的视图调用

joh*_* Gu 3 api asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我需要从我的asp.ner mvc Web应用程序中为BPM引擎调用JSON API.对BPM的API调用构造如下: -

http://localhost:8080/jw/web/json/workflow/process/list?j_username=kermit&hash=9449B5ABCFA9AFDA36B801351ED3DF66&loginAs=' + username
Run Code Online (Sandbox Code Playgroud)

其中j_user和hash参数表示在BPM引擎端设置的主登录用户名和密码.目前我在我的asp.net mvc的视图级别使用java /脚本调用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'));

            });
        }
    });


});
Run Code Online (Sandbox Code Playgroud)

但我被告知暴露主登录用户名和密码以及表示登录用户在asp.net mvc的用户名的LoginAS用户名是不安全的,我应该在服务器端进行API调用从JAVASCRIPT制作API调用.

但我的问题是如何将上面的代码转换为从mvc控制器端接收JSON,然后将JSON传递给视图?最好的祝福

Dar*_*rov 7

您可以使用WebClient将HTTP请求发送到指定的URL:

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用.NET 4.5中引入的新HttpClient:

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并从您的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>
Run Code Online (Sandbox Code Playgroud)