Как определить ReturnFormat внутри функции CFC и вернуть данные в выбранном формате? - PullRequest
1 голос
/ 29 декабря 2011

Я пишу следующую функцию на CFScript и хочу определить запрошенный ReturnFormat и вернуть данные в соответствующем формате.Обратите внимание, что я не определил ReturnFormat в функции вообще - я полагаюсь на установку его в своем вызове.

Например, URL для вызова этой функции будет похож на: http://localhost/com/Calendar.cfc?method=getCalendars&UserName=demo&returnFormat=json

/**
* 
* @hint Returns All Calendar records for one user.
* @output false
*/
remote any function GetCalendars(required string Username) {
    var data = [];
    var success = false;
    var message = "";

    try {
        query = new Query(); 
        query.setDataSource(APPLICATION.DSN);
        query.addParam(name = "username", value = Username, cfsqltype = "varchar");
        query.setSQL("
            SELECT idn, CalendarName, CalendarURL, CalendarColor
            FROM Calendars
            WHERE Username = :username 
            ORDER BY CalendarName, idn
        ");
        result = query.Execute();
        rs = result.getResult();
        success = true;
        message = "Success";
        records = rs.RecordCount;
    }
    catch (any excpt) {
        success = false;
        message = "An error occurred while getting calendars for user: " & Username;
    }
    finally {
        //TODO: If ReturnFormat = json, return a JSON string
        //TODO: If ReturnFormat = wddx, returna WDDX object
        //TODO: If ReturnFormat = plain, return an XML string
        return rs;
    }
} //end GetCalendars



В настоящее время этот метод возвращает либо автоматически форматированную строку JSON ColdFusion, например:

{"COLUMNS":["IDN","CALENDARNAME","CALENDARURL","CALENDARCOLOR"],"DATA":[[1,"Demo Calendar 1","http:\/\/localhost\/calendar\/feeds\/demo1\/basic","#43cd80"],[2,"Demo Calendar 2","http:\/\/localhost\/calendar\/feeds\/demo2\/basic","#9a9cff"]]}

ИЛИ объект WDDX, подобный следующему:

<wddxPacket version='1.0'><header/><data><recordset rowCount='2' fieldNames='IDN,CALENDARNAME,CALENDARURL,CALENDARCOLOR' type='coldfusion.sql.QueryTable'><field name='IDN'><number>1.0</number><number>2.0</number></field><field name='CALENDARNAME'><string>Demo Calendar 1</string><string>Demo Calendar 2</string></field><field name='CALENDARURL'><string>http:\/\/localhost\/calendar\/feeds\/demo1\/basic</string><string>http:\/\/localhost\/calendar\/feeds\/demo2\/basic</string></field><field name='CALENDARCOLOR'><string>#43cd80</string><string>#9a9cff</string></field></recordset></data></wddxPacket>

Но происходит сбой с ошибкой «Недопустимый тип возврата» при установке returnFormat=plain.

В основном мне нужно иметь способ проверить ReturnFormat.Затем я могу написать собственные подпрограммы return для возврата данных JSON, отформатированных так, как я хочу (любые имена в нижнем регистре! - я знаю, как это сделать, кстати, это не является частью этого вопроса) и в формате XML.

1 Ответ

2 голосов
/ 29 декабря 2011

Вы не обнаруживаете и не делаете ничего с помощью returnFormat. Дело не в этом. returnFormat сообщает CF, как следует обернуть ваши результаты. Повторяю: вы не беспокоитесь об этом. Период.

Так что дайте метод CFC, который создает массив, вы просто вернете массив. CF, если он видит returnformat = json, будет обрабатывать преобразование его в JSON.

Если он видит returnformat = plain, он выдаст ошибку (поскольку массив не может быть простой строкой).

Имеет ли это смысл?

О, я вижу ваш последний абзац. Если вы хотите попытаться выполнить возврат самостоятельно, вам не следует полагаться на формат возврата. Это запекается в CF. Я бы построил свой API, чтобы ВСЕГДА возвращать JSON, точку и делать свое собственное форматирование. Если вы установите returnFOrmat = plain в методе, он скажет CF не делать ничего. Пока вы вернете строку, с вами все будет в порядке.

...