NodeJSアプリからJava Jersey 2.0 APIバックエンドにマルチパートリクエストを行うためにrequest-promise
npm libを使用しています。 request
はform-data
libを使用して呼び出しを行うため、文字列、バッファ、ストリームのみを送信できることがわかります。 Javaのバックエンド側でJSONオブジェクトをストリーム化してストリームとして送信する[NodeJS]
、私は@FormDataParam
sとPOJOのオブジェクトを期待しています:
@GET
@ApiOperation(
value = "Gets party metadata by party_id",
notes = "Gets party metadata by party_id"
)
@ApiResponses(value = {
@ApiResponse(code = 200, message = "metadata")
})
@Path("party")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Metadata getByPartyId(
@ApiParam(value = "partyId", required = true) @NotNull @QueryParam("partyId") String partyId,
@ApiParam(value = "party metadata", required = true) @FormDataParam("metadata") Metadata metadata
) {
return folderCtrl.getByPartyId(partyId);
}
私も来て複数のPOJOオブジェクトを待って、私はそれらを検証するために、アノテーション検証メカニズムを使用していたエンドポイントがありますエンドポイントに受信したとき。 これまでは、POJOをJSONデータを含むファイルとして送信していたので、目的の動作をシミュレートできました。ジャージー/ジャクソンはこれをPOJOに変換し、ライフサイクルを継続することができました...
ここで、これらのエンドポイントをNodeJSから呼び出す必要があります。 それでは、私はform-data
と一緒に送ることができることを知っています。私は、JSONオブジェクトをストリームに変換し、以前のシナリオと同じようにPOJOオブジェクトを受け取るためのオプションを必要とすると思います。
私の質問はNodeJSのオブジェクトを「ストリーミング」してrequest-promise
で送信する方法です。
これは私が今持っているものです。
'use strict';
var rp = require('request-promise');
var express = require('express');
var fs = require('fs');
var metaJson = require(__dirname + '/attachments/metadata.json');
var router = express.Router();
const Readable = require('readable-stream').Readable;
const stream = Readable({objectMode: true});
stream._read =() => {};
const PROTOCOL = 'http://';
const HOST = 'localhost:';
const PORT = 8080;
// define the home page route
router.get('/', async function (req, res) {
stream.push(metaJson);
const options = {
method: req.method,
json: true,
baseUrl: PROTOCOL + HOST + PORT,
uri: req.originalUrl,
qs: {
partyId: "qwer"
},
formData: {
metadata: stream
},
};
try {
const response = await rp(options);
} catch (err) {
console.log(err);
}
res.send('foo res');
});
が、それは、このエラーで終わるです:
_http_outgoing.js:502
throw new TypeError('First argument must be a string or Buffer');
^
TypeError: First argument must be a string or Buffer
at ClientRequest.write (_http_outgoing.js:502:11)
at Request.write (/home/tepo/IdeaProjects/rig/node_modules/request/request.js:1514:27)
at FormData.ondata (internal/streams/legacy.js:16:26)
at emitOne (events.js:96:13)
at FormData.emit (events.js:191:7)
at FormData.CombinedStream.write (/home/tepo/IdeaProjects/rig/node_modules/combined-stream/lib/combined_stream.js:118:8)
at DelayedStream.ondata (internal/streams/legacy.js:16:26)
at emitOne (events.js:96:13)
at DelayedStream.emit (events.js:191:7)
at DelayedStream._handleEmit (/home/tepo/IdeaProjects/rig/node_modules/delayed-stream/lib/delayed_stream.js:82:15)
at Readable.source.emit (/home/tepo/IdeaProjects/rig/node_modules/delayed-stream/lib/delayed_stream.js:29:19)
at Readable.read (/home/tepo/IdeaProjects/rig/node_modules/readable-stream/lib/_stream_readable.js:386:26)
at flow (/home/tepo/IdeaProjects/rig/node_modules/readable-stream/lib/_stream_readable.js:734:34)
at resume_ (/home/tepo/IdeaProjects/rig/node_modules/readable-stream/lib/_stream_readable.js:717:3)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickCallback (internal/process/next_tick.js:104:9)
申し訳ありませんが、それは有効な点ですが、どうにかストリーミングを行う方法は? – greengold