0

(最初の Stack Overlflow の質問です!) 以下の Perl の例に基づいて、同等のフォーム データの http POST を Java でコーディングするのに苦労しています。私は WireShark を使用して、この実際の例をキャプチャしようとしました。投稿されている XML データを調べて、Java でコーディングできるようにしますが、ダイスは必要ありません。以下のコードのこの XML がどのようになるか知っている人はいますか? 正常に認証できますが、Java コードでフォーム データが拒否され続けます。

my $ua = LWP::UserAgent->new();
$ua->timeout($MYTIMEOUT);
$ua->credentials("myweb03:80","mydomain.com",$user, $password);

my $response = $ua->post($PEPSURL, 'content-type' => 'form-data',
                                 Content => {
                                 username => $user,
                                 prep_id => $prep_id,
                                 project => $project,
                                 upfile  => [ $uploadfile ],
                                 discussion => $discussion,
                                 silentsave => int($silentFlag)

             });
4

3 に答える 3

1

この質問に答えてくれた人たちとhttp://indiwiz.com/2009/02/11/multi-part-content-upload-in-apache-http-components-http-の主要なコード例のおかげでうまくいきましたクライアント/ . これは multipart/form-data ポストを行う方法の例で、その過程でテキスト ファイルをアップロードします。

package upfile;

import java.io.*;
import java.nio.charset.Charset;
import org.apache.http.*;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

public class Upfile {
    public static void main(String[] args) throws ClientProtocolException, IOException {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        try {
            httpclient.getCredentialsProvider().setCredentials(
                new AuthScope("<host>", 80, "<realm>", "basic"),
                new UsernamePasswordCredentials("<username>", "<password>"));
            HttpPost httpPost = new    HttpPost("<url>");
            MultipartEntity entity = new MultipartEntity();
            entity.addPart("username", new StringBody("<username>", Charset.forName("UTF-8")));
            entity.addParPart("id", new StringBody("86815", Charset.forName("UTF-8")));
            entity.addPart("project", new StringBody("GIZMO", Charset.forName("UTF-8")));
            entity.addPart("discussion", new StringBody("Discussion text; uploaded via Java!", Charset.forName("UTF-8")));
            File f = new File("/Users/sjd/myFile.txt");
            FileBody fileBody = new FileBody(f, "text/plain");
            entity.addPart("upfile", fileBody);
            httpPost.setEntity(entity);
            HttpResponse response = httpclient.execute(httpPost);

            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Response content length: " + 
                     entity.getContentLength());
                ByteArrayOutputStream outstream = new ByteArrayOutputStream();
                response.getEntity().writeTo(outstream);
                byte[] responseBody = outstream.toByteArray();
                System.out.println(responseBody.toString());
            }
            EntityUtils.consume(entity);
        } finally {        
            httpclient.getConnectionManager().shutdown();
        }
    }
}
于 2012-09-09T17:40:54.047 に答える
0

デロサスト:

この形式の LWP::UserAgent->post を使用しています:

$ua->post( $url, $field_name => $value,... Content => \%form )

LWP::UserAgentのドキュメントによると:

このメソッドは、指定された $url で POST 要求をディスパッチし、%form または @form が入力フォーム コンテンツのキーと値のペアを提供します。追加のヘッダーとコンテンツ オプションは、get() メソッドの場合と同じです。

このメソッドは、HTTP::Request::Common の POST() 関数を使用してリクエストを作成します。フォームの内容やその他の高度な機能を渡す方法の詳細については、HTTP::Request::Common を参照してください。

HTTP::Request::Commonから:

POST 'http://www.perl.org/survey.cgi',
       Content_Type => 'form-data',
       Content      => [ name  => 'Gisle Aas',
                         email => 'gisle@aas.no',
                         gender => 'M',
                         born   => '1964',
                         init   => ["$ENV{HOME}/.profile"],
                       ]

作成する:

  POST http://www.perl.org/survey.cgi
  Content-Length: 388
  Content-Type: multipart/form-data; boundary="6G+f"

  --6G+f
  Content-Disposition: form-data; name="name"

  Gisle Aas
  --6G+f
  Content-Disposition: form-data; name="email"

  gisle@aas.no
  --6G+f
  Content-Disposition: form-data; name="gender"

  M
  --6G+f
  Content-Disposition: form-data; name="born"

  1964
  --6G+f
  Content-Disposition: form-data; name="init"; filename=".profile"
  Content-Type: text/plain

  PATH=/local/perl/bin:$PATH
  export PATH

  --6G+f--

したがって、他のポスターは正しいです。形式は XML ではありません。

これが役に立てば幸いです。

于 2012-08-29T07:32:19.873 に答える
0

Java の post メソッドには「組み込み」はありません。ビルドするか、Apache の HttpComponents API を試すことができます。特に、HttpClient

于 2012-08-29T05:52:32.613 に答える