2

プロジェクトを再コーディングして、Android に実装されているデフォルトの HttpClient の代わりに okHttp を使用したいと考えています。

okhttp-main リリースの最新ソースをダウンロードしました。

ここで、POST リクエストを作成および構築する方法の例をいくつか見つけました。

今私の問題。複数のデータ (文字列、ファイルなど) を保持する RequestBody を作成したいのですが、それらを直接割り当てることはできません。

RequestBuilder は、追加されたデータを取得するさまざまなループを通過する必要があることを意味します。

OkHTTPs RequestBody は、例 https://github.com/square/okhttp/wiki/Recipesにリストされているように、すぐにデータが必要なようです

のようなものを試したいとき

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM);

for (Object aMData : dataClass.getData().entrySet()) {
            Map.Entry mapEntry = (Map.Entry) aMData;
            String keyValue = (String) mapEntry.getKey();
            String value = (String) mapEntry.getValue();
            requestBody.addPart(keyValue, value);
}


for (DataPackage dataPackage : dataClass.getDataPackages()) {
            requestBody.addPart("upfile[]", dataPackage.getFile());
}

requestBody.build();

build() 自体が RequestBody を作成するため、失敗します。単なる MultipartBuilder() になる前に。タイプを RequestBody に強制しようとすると、コンパイル/実行されません。

では、MultiPartBuilder を作成して DATA と Strings を追加した後に、これらのデータを追加する適切な方法は何ですか?

4

3 に答える 3

2

これはokHttp3を使用して私にとってはうまくいきました:

            OkHttpClient client = new OkHttpClient();
            File file = new File(payload);

            RequestBody formBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("file", "image.jpg",
                            RequestBody.create(MediaType.parse("image/jpg"), file))

                    .build();

            Request request = new Request.Builder().url(url).post(formBody).build();

            Response response = client.newCall(request).execute();
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
于 2016-06-21T10:49:48.783 に答える
1

敵博士の答えを修正しました:

 MultipartBody.Builder builder =new MultipartBody.Builder().setType(MultipartBody.FORM);

for (Object aMData : dataClass.getData().entrySet()) {
        Map.Entry mapEntry = (Map.Entry) aMData;
        String keyValue = (String) mapEntry.getKey();
        String value = (String) mapEntry.getValue();
        builder.addPart(keyValue, value);
}

for (DataPackage dataPackage : dataClass.getDataPackages()) {
        builder.addPart("upfile[]", dataPackage.getFile());
}

formDataPart のビルダーへの追加を開始し、最後に RequestBody を作成します

RequestBody requestBody = builder.build();

上記のアクションを実行できます

 compile 'com.squareup.okhttp3:okhttp:3.4.1'
于 2017-01-03T13:21:40.343 に答える