2017-06-21 89 views
0

不工作這是我的HTTP POST代碼,在本地主機上運行:Instagram的API通過的NodeJS

if(headers['Content-Type'] == undefined) 
     headers['Content-Type'] = 'application/x-www-form-urlencoded'; 

    var post_options = { 
      host: host, 
      path: path, 
      port: port, 
      method: 'POST', 
      headers: headers 
    }; 

    if(headers['Content-Type'] == "application/json"){ 
     post_options["json"] = true; 
     var post_data = JSON.stringify(body); 
    }else 
     var post_data = querystring.stringify(body); 

    var post_req = http.request(post_options, function(res) { 

      var body = ''; 

      console.log("INSIDE CALLBACK HTTP POST"); 

      res.setEncoding('utf8'); 

      res.on('data', function (chunk) { 
       body += chunk; 
       console.log('Response: ' + chunk); 
      }); 

      res.on('end', function() { 
      var post = querystring.parse(body); 
      console.log("FINAL BODY:",post); 
      }); 

      //console.log("RESPONSE in http POST:",res); 

     }); 

     // post the data 
     console.log("WRITING HTTP POST DATA"); 
     var sent_handler = post_req.write(post_data); 

     console.log("POST_REQ:",post_req); 
     console.log("sent_handler:",sent_handler); 

     post_req.end(); 

這裏是我發送到Instagram的準確信息:

  • host =「api.instagram。 COM」
  • path = 「/ OAuth的/的access_token」
  • body如下:

    body [「client_id」] = CLIENT_ID;

    body [「client_secret」] = CLIENT_SECRET;

    body [「grant_type」] =「authorization_code」;

    body [「redirect_uri」] = AUTHORIZATION_REDIRECT_URI;

    body [「code」] = login_code;

    body [「scope」] =「public_content」;

  • headers = {}(空,假定報頭[ '內容 - 類型'] ==未定義爲真)

  • 重要:sent_handler返回false

  • 的的console.log爲「FINAL BODY」(變量post)返回「{}」

要注意:通訊使用curl與api instagram作品。所以我真的相信這個問題出現在nodejs代碼的某些部分。

有沒有人有任何想法?請詢問是否需要更多信息

+0

請不要混淆,並從你的if語句它只是要求匹配省略括號發生災難,並大大降低了可讀性。 – brandonscript

+0

@brandonscript關於請求可能發生什麼的任何想法? – Fane

回答

0

好的,所以有三個主要問題會導致失敗,我可以看到。

1. Instagram的API只偵聽HTTPS,而不是HTTP。標準http節點模塊在此不起作用;您至少需要使用https

2.你定義一個名爲post_data條件語句中的變量:

if(headers['Content-Type'] == "application/json"){ 
    post_options["json"] = true; 
    var post_data = JSON.stringify(body); 
}else 
    var post_data = querystring.stringify(body); 

我們已經談過不是隱含括號亂搞(不要做到這一點),但除此之外,你'將局部變量的作用域定義爲僅限於條件語句並用數據填充它。一旦條件結束,它就會被銷燬。你可以在console.log(post_data)之後立即檢查它 - 它將是空的。

3.對於Instagram OAuth流程有三個截然不同的步驟 - 它看起來像你試圖(有點?)代理第一個重定向網址?但是,當它實際上是兩個截然不同的終端時,您也會爲這兩個網站呈現相同的網址。它看起來像你只是從How to make an HTTP POST request in node.js?複製代碼,而不完全理解它在做什麼或爲什麼。最重要的是,工作curl(Instagram示例代碼)的Content-Type,使用multipart/form-data,而不是x-www-form-urlencoded


解決方案

因爲你實際上沒有提供一個MCVE,我真的不能從斷碼你想做什麼推斷。我只能猜測,所以我打算給你一個解決方案,使用request來完成繁重的工作,所以你不必這樣做。你會注意到代碼的顯着減少。下面是它的步驟:

  1. 生成一個隱含的補助鏈接
  2. 創建偵聽重定向和捕捉授權碼
  3. 使POST請求Instagram的檢索令牌
服務器

在這裏你去:

const querystring = require('querystring'), 
     http = require('http'), 
     request = require('request'), 
     url = require('url') 

// A manual step - you need to go here in your browser 
console.log('Open the following URL in your browser to authenticate and authorize your app:') 
console.log('https://api.instagram.com/oauth/authorize/?' + querystring.stringify({ 
    client_id: "90b2ec5599c74517a8493dad7eff13de", 
    redirect_uri: "http://localhost:8001", 
    response_type: "code", 
    scope: "public_content" 
})) 

// Create a server that listens for the OAuth redirect 
http.createServer(function(req, res) { 
    // Regrieve the query params from the redirect URI so we can get 'code' 
    var queryData = url.parse(req.url, true).query || {} 

    // Build form data for multipart/form-data POST request back to Instagram's API 
    var formData = { 
     client_id: "90b2ec5599c74517a8493dad7eff13de", 
     client_secret: "1b74d347702048c0847d763b0e266def", 
     grant_type: "authorization_code", 
     redirect_uri: "http://localhost:8001", 
     code: queryData.code || "" 
    } 

    // Send the POST request using 'request' module because why would you do it the hard way? 
    request.post({ 
     uri: "https://api.instagram.com/oauth/access_token", 
     formData: formData, 
     json: true 
    }, function(err, resp, body) { 

     // Write the response 
     console.log(body) 
     res.setHeader('Content-Type', "application/json") 
     res.end(JSON.stringify(body)) 
    }) 

}).listen(8001)