cancel
Showing results for 
Search instead for 
Did you mean: 

Problem with json request

h_john
Champ on-the-rise
Champ on-the-rise

Hello.

I`m trying to make a webscript which will be able to:

1. receive json request;
2. get and transform argument from json request to java format;
3. find node in a specific folder using json argument as a search request;
4. get properties from found node;
5. transform found properties back to json string;
6. send answer in json;

Example of json request that I want to process 

$postData = array(
	'didNumber' => '0443334000',
	'srcNumber' => '0670219424',
	'companyID' => '3041',
	'requestType' => 'gettingCallSettings'
);

I`ve created next files after reading about json processing in Alfresco:

.get.desc.xml

<webscript>
  <shortname>negotiate</shortname>
  <description>negotiate JSON</description>
  <url>/negotiate</url>
  <authentication>guest</authentication>
  <negotiate accept="application/json">json</negotiate>
</webscript>

.get.json.ftl

{"response": "myObjAsString"}

.get.js

    var tel = json.get("srcNumber");
	var node = search.luceneSearch("@cm\\:name:\"" + nodeName+ "\" AND PARENT:\"workspace://SpacesStore/61d28f13-24e0-434a-8b90-5ea54d2fafa2\"");
	var name = node.properties["zkz:Name"];                                                                                                                             
    var myObj = {'name':'name'};
    var myObjAsString = jsonUtils.toJSONString(myObj);
    model.myObjAsString = myObjAsString;

But every time I try to execute my srcipt I receive something like this:

{
    "status" : 
  {
    "code" : 500,
    "name" : "Internal Error",
    "description" : "An error inside the HTTP server which prevented it from fulfilling the request."
  },  
  
  "message" : "09220628 Cannot locate template processor for template org\/alfresco\/negotiate.get.json",  
  "exception" : "org.springframework.extensions.webscripts.WebScriptException - 09220628 Cannot locate template processor for template org\/alfresco\/negotiate.get.json",

or if I clean all data from .get.js I receive text from .ftl file.

In the end I need to send back something like this:

die(json_encode(array(
	'customerData' => array(
		'name' => '1111111',
		'description' => '11111111111',
	)
)));

Please, can someone help me with js file? Can it be on Java or it must be in Json format?

6 REPLIES 6

afaust
Legendary Innovator
Legendary Innovator

jsonUtils.toJSONString should not be used - it does not fully support all native JS types - instead return the JS object as part of the model, and use FTL rendering to construct a proper JSON object structure.

search.luceneSearch should not be used - Lucene is legacy, only supported for unit / integration tests, does not receive any performance improvements etc.

You are missing a format element in the desc.xml to specify that the default response type should be JSON and thus the JSON FTL be used.

h_john
Champ on-the-rise
Champ on-the-rise

Thank you for you advice!

I made some changes using this tutorials https://docs.alfresco.com/5.2/references/dev-extension-points-webscripts.html

It works but now I need to use another answer format and can't change *.ftl file. 

In tutorial it was:

<#assign datetimeformat="EEE, dd MMM yyyy HH:mm:ss zzz">
{
    "acmeDocs" : [
        <#list acmeDocs as acmeDoc>
            {
                "name"          : "${acmeDoc.name}",
                "creator"       : "${acmeDoc.creator}",
                "createdDate"   : "${acmeDoc.createdDate?string(datetimeformat)}",
                "modifier"      : "${acmeDoc.modifier}",
                "modifiedDate"  : "${acmeDoc.modifiedDate?string(datetimeformat)}",
                "docId"         : "${acmeDoc.docId!"Unknown"}",
                "securityClass" : "${acmeDoc.securityClassification!"Unknown"}"
            }
            <#if acmeDoc_has_next>,</#if>
        </#list>
    ]
}

Ad it gives ne answer:

{
    "acmeDocs" : [
            {
                "name"          : "weqweqweqwrerwerwerweqwe",
                "creator"       : "i.gerts",
                "createdDate"   : "Sun, 27 Oct 2019 14:50:46 EET",
                "modifier"      : "i.gerts",
                "modifiedDate"  : "Sun, 27 Oct 2019 14:50:49 EET",
                "docId"         : "Unknown",
                "securityClass" : "Unknown"
            }
            
    ]
}

I tried to change it to my format:

die(json_encode(array(
	'customerData' => array(
		'name' => '${acmeDoc.name}',
		'description' => '${acmeDoc.creator}',
	)
)));

But it gives me 500 error

what I need to change in FTL?

afaust
Legendary Innovator
Legendary Innovator

Unless you provide any details on your 500 error, little help can be provided.

I am not sure what "your format" actually is - are you trying to generate some weird JSONP response content? The example with the "die" / "json_encode" functions really does not do anything to clear that up. Do you want to generate a response that would look similar to the result of these function calls? Then what actually does the "die" function generate? (I am not aware by what framework / language that function is provided and would not know what it does)

stivemorgan567
Champ in-the-making
Champ in-the-making

Hi there. I have had the same issue. Thanks for the information Smiley Frustrated

Check out my project get essays for sale

Hi! 

I have a little progress with it.

Now my files is:

acme-documents.get.desc.xml

<webscript>
    <shortname>Search ACME Documents</shortname>
    <description>Returns metadata as JSON for all ACME documents in the repository that matches search keyword</description>
    <url>/tutorial/acmedocs?q={keyword}</url>
    <authentication>user</authentication>
    <format default="json">argument</format>
    <family>Alfresco Tutorials</family>
</webscript>

acme-documents.get.js

function AcmeDocumentInfo(doc) {
    this.name = doc.properties["kezkz:Name"];
    this.linkToCrmUrl = doc.properties["kezkz:Email"];
    this.linkToCrmTitle = "Go to Alfresco";
    this.assignedToEmployeeNumber = doc.properties["kezkz:Napravl"];
}

function main() {
    var searchKeyword = json.get('srcNumber');
    if (searchKeyword == null || searchKeyword.length == 0) {
        searchKeyword = "";
    } 
var sort1 = 
{ 
  column: "@{http://www.alfresco.org/model/content/1.0}modified", 
  ascending: false 
}; 

var sort2 = 
{ 
  column: "@{http://www.alfresco.org/model/content/1.0}created", 
  ascending: false
}; 

var paging = 
{ 
  maxItems: 1, 
  skipCount: 0 
}; 



		var def =
  {
  query: "kezkz:Telefone:searchKeyword", 
  store: "workspace://SpacesStore", 
  language: "fts-alfresco", 
  sort: [sort1, sort2], 
  page: paging,
  };
  
      var acmeDocNodes = search.query(def);

    if (acmeDocNodes == null || acmeDocNodes.length == 0) {
        status.code = 404;
        status.message = searchKeyword;
        status.redirect = true;
    } else {
	        var acmeDocInfos = new Array();
        for (i = 0; i < acmeDocNodes.length; i++) {
            acmeDocInfos[i] = new AcmeDocumentInfo(acmeDocNodes[i]);
        }
        model.acmeDocs = acmeDocInfos;
        return model;
}
}

main();
                                                            

acme-documents.get.json.ftl

   { "customerData" : 
    <#list acmeDocs as acmeDoc>
            {
                "name"          : "${acmeDoc.name}",
                "linkToCrmUrl"          : "${acmeDoc.linkToCrmUrl}",
                "linkToCrmTitle"          : "Go to CRM",
                "assignedToEmployeeNumber"          : "${acmeDoc.assignedToEmployeeNumber}",
            }
        </#list>
}

It works when I set manualy search query and I can find nodes in folder and receive answer, but I still can not get args from json request use them as a searchKeyword and put to a query string.

When I use   json.get('srcNumber')

I receive an error "JSON is not defined"

And even if I try to set "searchKeyword" manualy I can not put this var to my search...

This part of my code:  query: "kezkz:Telefone:searchKeyword",

tries to find text "searchKeyword" but not the text I defined for "var searchKeyword" earlier.

What I do wrong? 

h_john
Champ on-the-rise
Champ on-the-rise

srcNumber - is a argument name in my GET request, which I send to Alfresco. 

In the end I need to:

1. Take Tel number from GET request

2. Search datalist item by this tel number

3. Send back same data list item properties in a json format