0

ブラウザを使用する場合と同じように、Java アプリケーションから Web サイトを使用しようとしています。このようなことを試みるのは初めてで、何かが足りないのではないかと心配しています。

私はpostメソッドでhttpリクエストを行うためにapache httpcoreライブラリを使用しています。wiresharkを使用して、postリクエストでパラメーターを確認し、Javaで行うリクエストにそれらを追加しました。ヘッダーについても同様です。

Javaで作成されたリクエストを盗聴すると、httpポストリクエストをキャプチャできませんが、tcpトラフィックのみをキャプチャできます。

これは私がリクエストを行う方法です:

HttpPost httpPost = new HttpPost("http://xxx.xxx");

httpPost.setHeader("Host", "xxx.xxx:xxxx");
.
.
.

HttpParams params = new BasicHttpParams();
params.setParameter("aaaa", "bbbb");
.
.
.

HttpResponse response = httpclient.execute(httpPost);

何か不足していますか?

私は何か他のものをチェックする必要がありますか?

助けてくれてどうもありがとう!

4

1 に答える 1

0

HttpPost で .setEntity(HttpEntity) メソッドを呼び出して、投稿リクエストで本文を指定する必要があります。

  private void sendToPostProxy(HttpServletRequest request,
          HttpServletResponse response) throws IOException {
      //the url to forward too
      String url = "http://127.0.0.1:"+proxyPort+request.getRequestURI()
              +(request.getQueryString()==null?"":"?"+request.getQueryString());
      HttpPost get = new HttpPost(url);
      //I am streaming requests straight through, but there are many Entity types you can use
      get.setEntity(new InputStreamEntity(request.getInputStream(), request.getContentLength()));
      sendToProxy(request, response, get);
  }
  private void sendToProxy(HttpServletRequest request,
          HttpServletResponse response,HttpRequestBase get) throws IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    Enumeration headers = request.getHeaderNames();
    //copy headers
    while(headers.hasMoreElements()){
        String next = String.valueOf(headers.nextElement());
        String header = request.getHeader(next);
        if (!get.containsHeader(next)&&!"Content-Length".equalsIgnoreCase(next))
            get.addHeader(next, header);
    }
    try{
    //perform post
    HttpResponse proxied = client.execute(get);
    //set client headers
    for (Header h : proxied.getAllHeaders()){
        response.setHeader(h.getName(), h.getValue());
    }
    //stream to client
    HttpEntity body = proxied.getEntity();
    body.writeTo(response.getOutputStream());
    response.setStatus(HttpServletResponse.SC_OK);

    }catch(Exception e){
        e.printStackTrace();
        get.abort();
    }
}
于 2012-08-29T10:36:49.680 に答える