16

特定の URL への一連のパラメーターを使用して POST 要求を実行しようとしています。私が抱えている問題は、POST リクエストが行われるが、パラメーターが渡されないことです。

    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url);

    StringBuilder sb = new StringBuilder();
    for ( String k: parmsRequest.keySet() ) {
        String vx = URL.encodeComponent( parmsRequest.get(k));
        if ( sb.length() > 0 ) {
            sb.append("&");
        }
        sb.append(k).append("=").append(vx);
    }

    try {
        Request response = builder.sendRequest( sb.toString(), new RequestCallback() {

            public void onError(Request request, Throwable exception) {}

            public void onResponseReceived(Request request, Response response) {}
        });
    } catch (RequestException e) {}
}

モード GET を使用して手動でクエリ文字列をリクエストに追加すると、これは問題なく機能しますが、渡されるデータが大きい可能性があるため、POST を使用する必要があります....

4

4 に答える 4

24

リクエストのヘッダーを設定します。

builder.setHeader("Content-type", "application/x-www-form-urlencoded");
于 2010-10-21T08:30:12.417 に答える
1

これはすでに機能しているはずですが、POST を使用する場合は、送信されたデータをサーブレットで別の方法で読み取る必要があります (サーバー側で Java を使用していると思いますか?)

次のようなサーブレットで試すことができます。

public class MyServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                   throws ServletException, IOException {

        System.out.println(req.getReader().readLine());
    }
}

もちろん、独自のバッファや文字列などreq.getReader()の内容をコピーすることもできます。req.getInputStream()

于 2010-10-21T12:58:40.610 に答える
0

私の推奨事項は次のとおりです。パラメーターアプローチをドロップします。

代わりに @RequestBody を使用してください。それははるかにきれいです。@RequestParam は、残りのサービスをすばやくテストするためにサーバーに対して GET リクエストを実行する場合にのみ役立ちます。ある程度複雑なデータを扱っている場合は、最大コンテンツ制限のないサーバーへの POST 要求を使用する方が適切です。

以下は、サーバーにリクエストを送信する方法の例です。注: この場合、バックエンドとして springboot を使用している場合は、コンテンツ タイプ fo を application/json に操作する必要があります。

private void invokeRestService() {
        try {
            // (a) prepare the JSON request to the server
            RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, JSON_URL);
            // Make content type compatible with expetations from SpringBoot
            // rest web service
            builder.setHeader("Content-Type", "application/json;charset=UTF-8");

            // (b) prepare the request object
            UserLoginGwtRpcMessageOverlay jsonRequest = UserLoginGwtRpcMessageOverlay.create();
            jsonRequest.setUserName("John777");
            jsonRequest.setHashedPassword("lalal");
            String jsonRequestStr = JsonUtils.stringify(jsonRequest);

            // (c) send an HTTP Json request
            Request request = builder.sendRequest(jsonRequestStr, new RequestCallback() {

                // (i) callback handler when there is an error
                public void onError(Request request, Throwable exception) {
                    LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON", exception);
                }

                // (ii) callback result on success
                public void onResponseReceived(Request request, Response response) {
                    if (200 == response.getStatusCode()) {
                        UserLoginGwtRpcMessageOverlay responseOverlay = JsonUtils
                                .<UserLoginGwtRpcMessageOverlay>safeEval(response.getText());
                        LOGGER.info("responseOverlay: " + responseOverlay.getUserName());
                    } else {
                        LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON (" + response.getStatusText() + ")");
                    }
                }
            });
        } catch (RequestException e) {
            LOGGER.log(Level.SEVERE, "Couldn't execute request ", e);
        }
    }

UserLoginGwtRpcMessageOverlay はパッチ作業であることに注意してください。これは GwtRpc シリアライズ可能オブジェクトではなく、gwt javascript オブジェクトを拡張するクラスです。

よろしく。

于 2016-11-26T17:13:34.553 に答える
0

Web フォームを使用して、GET と POST を組み合わせて使用​​するページに要求を送信することはできません。フォームのメソッドを GET に設定すると、すべてのパラメーターがクエリ文字列に含まれます。フォームのメソッドを POST に設定すると、すべてのパラメーターが要求本文に含まれます。

出典: HTML 4.01 標準、セクション 17.13 フォーム送信 URL: http://www.w3.org/TR/html4/interact/forms.html#submit-format

于 2010-10-21T08:44:14.223 に答える