Dynamics CRM:JavaScript GET请求未使用Web.Api检索记录

Dynamics CRM:JavaScript GET请求未使用Web.Api检索记录,javascript,asp.net-web-api,dynamics-crm,dynamics-crm-2016,dynamics-365,Javascript,Asp.net Web Api,Dynamics Crm,Dynamics Crm 2016,Dynamics 365,我已经在事件表单上编写了以下JS函数来检索合同行,但该函数并没有做任何事情。我已经验证了Fetch查询,它返回结果。所以数据确实存在。我已经调试过了,看起来是这样的。readyState==4为false 谁能告诉我我的代码有什么问题吗。我需要添加任何程序集吗 谢谢 function Test() { var customerId = Xrm.Page.getAttribute("parentcustomer").getValue(); if (customerId == nu

我已经在事件表单上编写了以下JS函数来检索合同行,但该函数并没有做任何事情。我已经验证了Fetch查询,它返回结果。所以数据确实存在。我已经调试过了,看起来是这样的。readyState==4为false

谁能告诉我我的代码有什么问题吗。我需要添加任何程序集吗

谢谢

function Test() {

    var customerId = Xrm.Page.getAttribute("parentcustomer").getValue();
    if (customerId == null) {
        return;
    }

    var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" +
        "<entity name='contractdetail'>" +
        "<attribute name='contractid' />" +
        "<attribute name='contractdetailid' />" +
        "<filter type='and'>" +
        "<condition attribute='statuscode' operator='in'>" +
        "<value>2</value>" +
        "<value>1</value>" +
        "</condition>" +
        "<condition attribute='customerid' operator='eq' value='" +
        customerId[0].id +
        "' />" +
        "</filter>" +           
        "</entity>" +
        "</fetch>";

    var uri = "/contractdetail?fetchXml=" + encodeURIComponent(fetchXml);
    var clientUrl = Xrm.Page.context.getClientUrl();
    var webAPIPath = "/api/data/v8.1";   
    uri = clientUrl + webAPIPath + uri;

    var request = new XMLHttpRequest();
    request.open("GET", encodeURI(uri), false);
    request.setRequestHeader("Accept", "application/json");
    request.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    request.setRequestHeader("OData-MaxVersion", "4.0");
    request.setRequestHeader("OData-Version", "4.0");
    request.onreadystatechange = function() {
        if (this.readyState == 4 /* complete */) {
            request.onreadystatechange = null;

            switch (this.status) {
                case 200: // Success with content returned in response body.
                case 204: // Success with no content returned in response body.
                    var data = JSON.parse(this.response);
                    if (data && data.value) {
                    for (var indexContractLine = 0; indexContractLine < data.value.length; indexContractLine++) {
                        alert(data.value[indexContractLine].contractdetailid);
                        //alert(data.value[indexContractLine]['@odata.etag']);
                    }
                }
                    break;
                default: // All other statuses are unexpected so are treated like errors.
                    var error;
                    try {
                        error = JSON.parse(request.response).error;
                    } catch (e) {
                        error = new Error("Unexpected Error");
                    }
                    alert(error);
                    break;
            }

            if (this.status == 200) {
                var data = JSON.parse(this.response);
                if (data && data.value) {
                    for (var indexContractLine = 0; indexContractLine < data.value.length; indexContractLine++) {
                        alert(data.value[indexContractLine].contractdetailid);
                        alert(data.value[indexContractLine]['@odata.etag']);
                    }
                } else {
                    var error = JSON.parse(this.response).error;
                    alert(error.message);
                }
            }
        };
        request.send();
    }
}   
内部onreadystatechange将此替换为请求

下面是一段直接来自生产环境的代码示例注意:这是一个POC,并不意味着要复制粘贴到代码中以显示其最终的外观:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
    if (xhttp.readyState == 4) {
        if (xhttp.status == 200) {
            xhttp.onreadystatechange = null; // avoid memory leaks
            var data = JSON.parse(xhttp.response);
            onsuccess(data);
        }
        else {
            var error = JSON.parse(xhttp.response).error;
            onerror(error);
        }
    }
};
内部onreadystatechange将此替换为请求

下面是一段直接来自生产环境的代码示例注意:这是一个POC,并不意味着要复制粘贴到代码中以显示其最终的外观:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
    if (xhttp.readyState == 4) {
        if (xhttp.status == 200) {
            xhttp.onreadystatechange = null; // avoid memory leaks
            var data = JSON.parse(xhttp.response);
            onsuccess(data);
        }
        else {
            var error = JSON.parse(xhttp.response).error;
            onerror(error);
        }
    }
};

您可能需要安装Jason Lattimer的CRM RESTBuilder解决方案以进行进一步测试


它提供了一个GUI来创建Web API查询,然后您可以根据自己的喜好进行测试和修改。

您可能需要安装Jason Lattimer的CRM RESTBuilder解决方案来进行进一步的测试


它提供了一个GUI来创建Web API查询,然后您可以根据自己的喜好对其进行测试和修改。

谢谢@Alex,我想我遗漏了一些东西。代码现在完全符合您的建议,但它仍然没有达到这个条件'if request.readyState==4'我只是在这里傻了。事实上,我们正在升级到365,而我所工作的组织仍然使用v8.0。现在readyState是4,但状态是404。谢谢@Alex,我想我遗漏了一些东西。代码现在完全符合您的建议,但它仍然没有达到这个条件'if request.readyState==4'我只是在这里傻了。事实上,我们正在升级到365,而我所工作的组织仍然使用v8.0。现在readyState为4,但状态为404。。。它的惊人外观可以帮助代码:。。。太棒了