【ネットワーク】Retrofit 2 POST(パラメータ転送とファイルアップロード)

7175 ワード

tjstudy:前の環境に書く:android 2.1.1,Retrofit2
理解が間違っていて、修正する必要があります.phpサーバ側がファイルを受信する方法が間違っているようです.のリンクジャンプ:http://blog.csdn.net/u012391876/article/details/52913805
個人使用概要
1.Retrofitのインポートに必要なパッケージ
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'

ここでは、KLOGインポートパッケージを印刷するのに便利なツールをお勧めします.
compile 'com.github.zhaokaiqiang.klog:library:1.5.0'

2、ネットワークアクセスインタフェース類APIService
  • 1、通常のpostパラメータ
  • 2、ファイルをアップロードするように配列名をfile、ファイル名をtestと指定する.png、使いにくいです.マルチファイルアップロード、@PartMap Map paramsを使用する場合は、各RequestBodyファイルを設定するときに配列名が一致しないと上書きされることに注意してください.
  • 3、アップロードファイル
  • 4、マルチファイルのアップロード
  • 5、アップロードファイルとパラメータパラメータもMultipartBodyにカプセル化する必要がある.Partのようなタイプは、そうでないと転送がエラーになります.このタイプは、Formにカプセル化されたタイプです.ここではFormUrlEncodedを使用して処理できないからです.
  • /**
     *       
     */
    public interface APIService {
        //1、
        @FormUrlEncoded
        @POST("test.php")
        Observable login(
                @Field("no") String no,
                @Field("pass") String pass);
    
        //2、
        @Multipart
        @POST("upload.php")
        Observable uploadFile(
            @Part("file\"; filename=\"test.png") RequestBody file
         );
        //3、
        @Multipart
        @POST("upload.php")
        Observable uploadFile(
                @Part MultipartBody.Part file );
        //4、
        @Multipart
        @POST("upload.php")
        Observable uploadFile(
                @Part() List files );
        //5、
        @Multipart
        @POST("upload.php")
        Observable uploadFile(
             @Part() List files );
    }

    MultipartBodyはokhttp 3の1つの方法であり、okhttp 2には存在しない.
    3、Post方式説明
    方式1は対応する着信Stringだけでよい、方式2は他を無視してMultipartBodyを通過する必要がある.partのパッケージpartのパッケージ
  • 1)ファイルのカプセル化:
  • File file = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/Pictures/test111.png");
    RequestBody requestBody =
                RequestBody.create(MediaType.parse("image/png"), file);
    //  12    。
    MultipartBody.Part photo1part = 
                MultipartBody.Part.createFormData("pic1", "pic2", requestBody1);

    phpが受け取ったデータは下図のようです.
    【网络】Retrofit2 POST(参数传递和文件上传)_第1张图片
    複数のファイルをアップロードすると、このような配列が複数あります.
  • 2)パラメータのパッケージング:
  • MultipartBody.Part no = 
                MultipartBody.Part.createFormData("name", “tjstudy”);

    4、方式1がMultipartBodyに変わる.Part方式
    理解できるのはpartはパラメータをフォームにカプセル化するためのスタイルです.
    @Multipart
    @POST("test.php")
    Observable login(
            @Part MultipartBody.Part no,
            @Part MultipartBody.Part pass);
    MultipartBody.Part no = 
            MultipartBody.Part.createFormData("name", “tjstudy”);
    MultipartBody.Part pass =
            MultipartBody.Part.createFormData("pass", “123456”);

    その後ネットワークアクセスを行い,ネットワークインタフェース内の対応するメソッドを呼び出せばよい(上のこのloginメソッド)
    5、また踏み込んだ(ファイルとパラメータを一緒にアップロード)
  • 1)パラメータアップロード:@Part("no")String noを使用してネットワークにアクセスし、サーバ側からこのようなデータ「no」="12345」を受け取った.
  • 2)パラメータアップロード:
  • ネット上のもう一つの方法は、post方式で@Query("no")String noを使って何もアップロードに成功せず、ネットにアクセスしていない.—-QueryはGet方式のアクセス方式であり、成功しないはずだ.ネット上の少数のブログにも穴がある.
  • 3)マルチファイルアップロード-1つだけアップロード
  • Retrofitがアップロードすると、関連情報は1つの配列に入れられ、配列名が同じであればファイルが上書きされ、1つのファイルしかアップロードされません.ファイルのアップロードは、私が理解しているように、jsonデータのセットにファイルを保存し、各ファイルを個別のオブジェクトで保存します.–ファイル、配列名は同じではありません.
    6、使用総括
    パラメータを渡すだけの場合は、方式1(@FormUrlEncodedと@Field("no")String no)をそのまま使えば良いのですが、ファイルをアップロードするには@Multipartをタグとして使う必要があり、アップロードするファイルやパラメータはMultipartBodyにカプセル化する必要があります.パーティーの中.