2014-12-05 3 views
2

Мне уже потребовалось несколько часов, чтобы реализовать cookie на url MeteorJS. Что мне нужно сделать, так это передать данные cookie n url, такие как «CURLOPT_COOKIE» PHP. Я не могу найти код примера на своих документах и ​​даже на форумах. На данный момент у меня есть следующие функции:Передача данных cookie по запросу MeteorJS HTTP

/* HTTP REQUEST */ 
Meteor.methods({ 
    httpRequest: function(type, uri, params){ 
    this.unblock(); 
    check(type, String); 
    check(uri, String); 
    check(params, Object); 
    try { 
     var result = HTTP.call(type, uri, {params: params}); 
     return result; 
    } catch (e) { 
     // Got a network error, time-out or HTTP error in the 400 or 500 range. 
     return e; 
    } 
    } 
}); 
// HTTP request with cooki 
getUserDetails: function(session_id, uid){ 
    var params = { 
    headers: { 
     Cookie: { 
     sessid: session_i 
     } 
    },  
    uid: uid 
    }; 
    var response = Meteor.call('httpRequest', "POST", "http://example.com/rest/wp /alt_wp_resources/loaduser.json", params); 
    //res = JSON.parse(response.content); 
    return response; 
} 
// call here 
Meteor.startup(function() { 
// delay for 5 sec 
Meteor.setTimeout(function(){ 
    Meteor.call('getUserCredentials', 'api12345', '123qweasd', function (error, result) {     
    // check user authentication 
    var success = result.success; 
    console.log(result); 
    // user has account from lpgp site, let's save him to meteor. 
    if (success){ 
     console.log('success'); 
     var session_id = result.session_id; 
     //console.log(_session_id); 
     Meteor.call('getUserDetails', 'SESSba071091c09f79fefd66e4884dcdde50', 68558, function (error, result) { 
      if (!error) 
       console.log(result); 
      else 
       console.log(error);   
     });   
    }else 
     // app can't find user account from lpgp site. 
     console.log(error);    
}); 
}, 5000); 
}); 

Звонок успешный, но только что вернул успех: false.

Ответ:

Object {statusCode: 200, content: "{"success":false}", headers: Object, data: Object} 

ответ

3

HTTP модуль Метеор на стороне сервера является лишь оболочкой для npm module named request. Модуль request npm включает поддержку для указания ваших собственных файлов cookie, а также сохранения их в банке cookie (просто следуйте по ссылке и найдите «cookie»). Размер файла cookie по умолчанию - tough-cookie, и, интересно, Meteor включает его, хотя я не вижу возможности использовать его у Meteor.HTTP.

Результатом этих деталей реализации является то, что вы можете напрямую использовать request. Я применил аналогичный подход к запросу на обертку как HTTP-модуль Meteor, но вместо ограниченного поднабора параметров, предоставляемых HTTP, моя обертка позволяет получить полный доступ ко всем возможностям request и tough-cookie. Приятная часть состоит в том, что вам даже не нужно напрямую добавлять request в зависимость от ваших собственных, поскольку это уже зависимость Meteor. Конечно, риск состоит в том, что более поздняя версия Meteor может использовать что-то помимо request, и ваш код сломается.

В любом случае, вот моя собственная обертка для request. Он включает пример поддержки файлов cookie JSessionID для создания вызовов API Jenkins. Просто поместите это в файл syncRequest.coffee в папку \server и убедитесь, что вы добавили пакет coffeescript (Meteor add coffeescript) ... или скомпилируете мой код и сохраните его в .js-файле в папке \server.

request = Npm.require('request') 

populateData = (response) -> 
    contentType = (response.headers["content-type"] or ";").split(";")[0] 
    if _.include([ "application/json", "text/javascript" ], contentType) 
    try 
     response.data = JSON.parse(response.content) 
    catch err 
     response.data = null 
    else 
    response.data = null 

normalizeOptions = (uri, options, callback) -> 
    unless uri? 
    throw new Error("undefined is not a valid uri or options object.") 

    if (typeof options is "function") and not callback 
    callback = options 

    if options and typeof options is "object" 
    options.uri = uri 
    else if typeof uri is "string" 
    options = uri: uri 
    else 
    options = uri 

    return {options, callback} 

normalizeResponse = (error, res, body) -> 
    response = null 
    unless error 
    response = {} 
    response.statusCode = res.statusCode 
    response.content = body 
    response.headers = res.headers 
    populateData(response) 
    if response.statusCode >= 400 
     error = makeErrorByStatus(response.statusCode, response.content) 
    return {error, response} 

wrappedRequest = (uri, options, callback) -> 
    {options, callback} = normalizeOptions(uri, options, callback) 
    request(options, (error, res, body) -> 
    {error, response} = normalizeResponse(error, res, body) 
    callback(error, response) 
) 

wrappedCall = (method, uri, options, callback) -> 
    options.method = method 
    wrappedRequest(uri, options, callback) 

wrappedGet = (uri, options, callback) -> wrappedCall("GET", uri, options, callback) 
wrappedPost = (uri, options, callback) -> wrappedCall("POST", uri, options, callback) 
wrappedPut = (uri, options, callback) -> wrappedCall("PUT", uri, options, callback) 
wrappedDelete = (uri, options, callback) -> wrappedCall("DELETE", uri, options, callback) 

getWithJSession = (j_username, j_password, securityCheckUri, uri, callback) -> 
    request = request.defaults({jar: true}) 

    form = {j_username, j_password} 

    request.post({uri: securityCheckUri, form: form}, (error, response, body) -> 
    if error? 
     throw new Error(error) 
    else if response.statusCode isnt 302 
     throw new Error("Expected response code 302 (forward). Got #{response.statusCode}") 
    else 
     request.get(uri, (error, res, body) -> 
     {error, response} = normalizeResponse(error, res, body) 
     callback(error, response) 
    ) 
) 

syncRequest = Meteor.wrapAsync(wrappedRequest) 
syncRequest.call = Meteor.wrapAsync(wrappedCall) 
syncRequest.get = Meteor.wrapAsync(wrappedGet) 
syncRequest.post = Meteor.wrapAsync(wrappedPost) 
syncRequest.put = Meteor.wrapAsync(wrappedPut) 
syncRequest.delete = Meteor.wrapAsync(wrappedDelete) 
syncRequest.del = syncRequest.delete 

syncRequest.getWithJSession = Meteor.wrapAsync(getWithJSession) 
syncRequest.getWithJsession = syncRequest.getWithJSession 

(exports ? this).syncRequest = syncRequest 

 Смежные вопросы

  • Нет связанных вопросов^_^