2013-12-19 5 views
1

Почему это возвращает 400 ошибки (уникальный запрос может иметь более одного результата Got 100.):Возврат все от типа - Freebase MQL

[{ 
    name:null, 
    type:'music/artist' 
}] 

Я бы ожидать, что она вернется первые 100 имен из музыка/художник? Как это уникальный запрос?

Я пытаюсь построить случайный запрос, где я могу предоставить два Params - страницу и результат в пределах страницы, чтобы вернуться - и получить один пункт назад

Было бы удивительным, если MQL поддержали что-то вроде return: 'random'

EDIT - добавляет полный угловой завод. Запрос выполняется нормально, если я вставляю его в механизм freebase.com/query.

myApp.factory('FB_Random', function ($http) { 
    return { 
     fn: function (callback) { 
      $http.get("https://www.googleapis.com/freebase/v1/mqlread", 
       { 
        params: { 
         query:[{ 
          name: null, 
          type: '/music/artist' 
         }]       
        } 
       } 
      ).success(function (d, status, headers, config) { 
       callback(d.result); 
      }).error(function (d, status, headers, config) { 
       console.log(d); 
      }); 
     } 
    }; 
}); 
+0

Это выглядит хорошо для меня. Существует незначительный тип имени типа (/ music/artist). Можете ли вы опубликовать код Javascript? –

ответ

1

Похоже, есть некоторые недокументированные Угловое поведение здесь. В соответствии с the Angular docs параметр params принимает «карту строк или объектов, которые будут перенаправлены на ?key1=value1&key2=value2 после URL».

Однако, похоже, есть дополнительная логика, которая ищет значения массива в параметрах и превращает их в повторяющиеся параметры; то есть. ?query={...}&query={...}. Поскольку ваш запрос (правильно) завернут в нотацию массива, указав, что вы ожидаете нескольких результатов, Angular интерпретирует его как список с единственным значением параметра запроса. Затем извлекает этот параметр запроса и добавляет его в URL, как так:

https://www.googleapis.com/freebase/v1/mqlread?query={%22name%22:null,%22type%22:%22/music/artist%22} 

Вот почему вы получите ошибку о вашем запросе неправильно просить одного результата. Потому что Angular удалил нотацию внешнего массива, которая нужна MQL.

Самый простой способ обойти это просто обернуть запрос в дополнительном массиве, как это:

$http.get("https://www.googleapis.com/freebase/v1/mqlread", 
    { 
    params: { 
     query:[[{ 
     name: null, 
     type: '/music/artist' 
     }]]      
    } 
    } 
) 

Если вы хотите, чтобы исправить более четко и ваш код легче читать вы можете просто стройте запрос MQL следующим образом:

$http.get("https://www.googleapis.com/freebase/v1/mqlread", 
    { 
    params: { 
     query: JSON.stringify([{ 
     name: null, 
     type: '/music/artist' 
     }])      
    } 
    } 
) 
+0

Большое спасибо Шон, это огромная помощь. – Nathan