8484


CasperJSでMicrosoft Translatorを使用するため、下記コードでアクセストークンを取得しようとしました。  
しかし、本来、アクセストークンを含むjson形式のデータが入っているはずのresponse.dataがnullになります。ヘッダー情報などは正しく返ってきているのですが、なぜなのでしょうか？

ちなみに、dataオブジェクトとheadersオブジェクトの同じ値を使用し、phpで実行すると、正しくアクセストークンを取得できます。

_main.js_

[code]

    "use strict";
    
    var utils = require('utils');
    var translator = require('translator');
    var casper = require('casper').create({
      exitOnError: true,
      verbose: true,
      logLevel: "info",
      pageSettings: {
        userAgent: 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36',
        loadImages: false,
        loadPlugins: false,
        webSecurityEnabled: false,
        ignoreSslErros: false
      },
      stepTimeout: 10000,
      onStepTimeout: function(milliseconds, step) {
        this.echo('stopped step is ' + step);
        this.clear();
      }  
    });
    
    casper.start();
    
    casper.then(function() {
      translator.translate();
    });
    
    casper.run(function() {
      this.exit();
    });
    
[/code]

_translator.js_

[code]

    "use strict";
    
    exports.translate = function() {
    
      var tokenUrl = 'https://datamarket.accesscontrol.windows.net/v2/OAuth2-13';
      var data = {
        'client_id': 'myClientId',
        'client_secret': 'myClientSecret',
        'scope': 'http://api.microsofttranslator.com',
        'grant_type': 'client_credentials'
      };
    
      casper.thenOpen(tokenUrl,
        {
          method: 'post',
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
          },
          data: {
            'client_id': data.client_id,
            'client_secret': data.client_secret,
            'scope': data.scope,
            'grant_type': data.grant_type
          }
        },
        function(response) {
          utils.dump(response);
        }
      );
    };
    
[/code]

_response内容_

[code]

    {
        "contentType": "application/json; charset=utf-8",
        "headers": [
            {
                "name": "Cache-Control",
                "value": "no-cache, no-store"
            },
            {
                "name": "Pragma",
                "value": "no-cache"
            },
            {
                "name": "Content-Type",
                "value": "application/json; charset=utf-8"
            },
            {
                "name": "Expires",
                "value": "-1"
            },
            {
                "name": "request-id",
                "value": "1063d5ba-40af-4997-ac27-9b3ba456c6d0"
            },
            {
                "name": "X-Content-Type-Options",
                "value": "nosniff"
            },
            {
                "name": "Strict-Transport-Security",
                "value": "max-age=31536000; includeSubDomains"
            },
            {
                "name": "Date",
                "value": "Thu, 26 Mar 2015 07:38:52 GMT"
            },
            {
                "name": "Content-Length",
                "value": "608"
            }
        ],
        "id": 1,
        "redirectURL": null,
        "stage": "end",
        "status": 200,
        "statusText": "OK",
        "time": "2015-01-13T06:39:33.248Z",
        "url": "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13",
        "data": null
    }
    
[/code]


CC BY-SA 3.0
2015-03-26T07:58:01.637
8430
2015-03-27T09:00:58.803
2015-03-26T08:09:50.647
question
javascript casperjs
CasperJSでMicrosoft Translatorのアクセストークンを取得できない

[code]

    casper.thenOpen(tokenUrl,
      {
        method: 'post',
        headers: {
          'Content-Type': 'application/x-www-form-urlencoded'
        },
        data: {
          'client_id': data.client_id,
          'client_secret': data.client_secret,
          'scope': data.scope,
          'grant_type': data.grant_type
        }
      },
      function(response) {
        utils.dump(response);
      }
    );
    
[/code]

上記コード、function引数のところで、

[code]

    function(response) {
      this.getPageContent();
    }
    
[/code]

とすることで、返ってきたデータを確認することができました。

結果的に、Microsoft Translatorは、トークン情報をhtmlとして返していました。  
謎は、responseのdata部分には何に使うのかということです。  
HTTPについて勉強し直します。お騒がせ致しました。


CC BY-SA 3.0
2015-03-27T07:04:00.490
8477
2015-03-27T07:04:00.490
8430
answer


`resource.data` は CasperJS 1.1
で追加された独自拡張で、HTTPのレスポンスとは特に関係ないようですね。使用例はAPIリファレンスで `response.data`
を検索すると色々出てきました。

  * [`eachThen()`](http://casperjs.readthedocs.org/en/latest/modules/casper.html#eachthen) では、列挙した各要素
  * [`waitForAlert()`](http://casperjs.readthedocs.org/en/latest/modules/casper.html#waitforalert) では、 `alert()` に渡されたメッセージ

ソースコードを辿ると、 `response` の大半を占めるレスポンス情報は PhantomJS
由来のようなので、そちらのドキュメントも参考になるかもしれません。（もちろん `data` は記載されていません）

[onResourceReceived | PhantomJS](http://phantomjs.org/api/webpage/handler/on-
resource-received.html)

自己解決されたように、レスポンスの中身は `this.getPageContent()` で取得し、JSONであれば `JSON.parse()`
を使うことになると思います。

> 結果的に、Microsoft Translatorは、トークン情報をhtmlとして返していました。

`getPageContent()` を使うことで、そう思われたのでしょうか。

HTTPからすればどちらもレスポンスの中身に過ぎず、 `getPageContent()`
はそれを取得するだけです。得られるデータはHTML、JSON、あるいは他の形式かもしれません。

実際 `getPageContent()` の説明でもTwitterAPIからJSONを取得していますね。

<http://casperjs.readthedocs.org/en/latest/modules/casper.html#getpagecontent>


CC BY-SA 3.0
2015-03-27T09:00:58.803
8484
2015-03-27T09:00:58.803
8000
8430
answer