0

Node/Express REST API をテストするために SuperAgent を使用しています。

.send を使用すると、本文のコンテンツが自動的に JSON に変換されます。プレーンテキストのみを送信したい。次に例を示します。

request.post('localhost:3000/api/compile' )
        .send('my example text that gets converted to JSON')
        .set('Content-Type', 'application/x-www-form-urlencoded')

Content-Type ヘッダーを変更しようとしましたが、それでもオブジェクトが送信されます。

SuperAgent に強制的にプレーン テキストのみを使用させるにはどうすればよいですか?


更新 1: 提案されているように .type('form') を追加しても、デフォルトは JSON です。

request.post('localhost:3000/api/compile' )
        .type('form')
        .send('my example string')
        .set('Authorization', un+':'+key)
         //.set('Content-Type', 'application/x-www-form-urlencoded')
        .end(function(err, res){
                res.should.have.status(200);
                done();
        });

これは与える -

 object
{ 'my example string': '' }

更新 2: バックエンド コードの追加。これは単純にエクスプレスでしょうか?

app.js

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var api = require('./routes/api');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);
app.use('/api', api);

ルート:

    router.post('/compile', function(req, res) {
      console.log(typeof(req.body));
      console.log(req.body);

      res.send('respond with a resource');
      res.end();

});

解決策 - BodyParser を削除します。

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');
var api = require('./routes/api');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
//app.use(bodyParser.json());
//app.use(bodyParser.urlencoded());

app.use (function(req, res, next) {
    var data='';
    req.setEncoding('utf8');
    req.on('data', function(chunk) {
        data += chunk;
    });
    req.on('end', function() {
        req.rawBody = data;
        next();
    });
});

app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);
app.use('/api', api);
4

1 に答える 1

0

.type('form')フォーマット済みのデータがあることを示すために使用しx-www-form-urlencodedます。

request.post('localhost:3000/api/compile')
  .type('form')
  .send('username=bob')

ここのソースのドキュメントを参照してください。x-www-form-urlencoded には他にも便利なバリエーションがいくつかあります。

あなたの質問には、 vs についての説明とコードが矛盾text/plainapplication/x-www-form-urlencodedていますが、本当にプレーンテキストを送信したい場合は、.type('text/plain').

于 2014-05-28T01:50:43.693 に答える