@Test public void bodyInNonBodyRequest() { class Example { @Multipart // @PUT("/") // Call<ResponseBody> method(@Part("one") String o1, @Body String o2) { return null; } } try { buildRequest(Example.class); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@Body parameters cannot be used with form or multi-part encoding. (parameter #2)\n for method Example.method"); } }
@Test public void multipartRequiresName() { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part RequestBody part) { return null; } } try { buildRequest(Example.class, new Object[] { null }); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@Part annotation must supply a name or use MultipartBody.Part parameter type. (parameter #1)\n" + " for method Example.method"); } }
@Test public void multipartOkHttpPartForbidsName() { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("name") MultipartBody.Part part) { return null; } } try { buildRequest(Example.class, new Object[] { null }); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@Part parameters using the MultipartBody.Part must not include a part name in the annotation. (parameter #1)\n" + " for method Example.method"); } }
@Test public void multipartArrayOkHttpPart() { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("ping") MultipartBody.Part[] part) { return null; } } try { buildRequest(Example.class, new Object[] { null }); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@Part parameters using the MultipartBody.Part must not include a part name in the annotation. (parameter #1)\n" + " for method Example.method"); } }
@Test public void multipartPartMapRejectsOkHttpPartValues() { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@PartMap Map<String, MultipartBody.Part> parts) { return null; } } try { buildRequest(Example.class, new Object[] { null }); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@PartMap values cannot be MultipartBody.Part. Use @Part List<Part> or a different value type instead. (parameter #1)\n" + " for method Example.method"); } }
@Test public void multipartIterableRequiresName() { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part List<RequestBody> part) { return null; } } try { buildRequest(Example.class, new Object[] { null }); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@Part annotation must supply a name or use MultipartBody.Part parameter type. (parameter #1)\n" + " for method Example.method"); } }
@Test public void multipartIterableOkHttpPart() { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("ping") List<MultipartBody.Part> part) { return null; } } try { buildRequest(Example.class, new Object[] { null }); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@Part parameters using the MultipartBody.Part must not include a part name in the annotation. (parameter #1)\n" + " for method Example.method"); } }
@Test public void multipartNullRemovesPart() throws IOException { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("ping") String ping, @Part("fizz") String fizz) { return null; } } Request request = buildRequest(Example.class, "pong", null); assertThat(request.method()).isEqualTo("POST"); assertThat(request.headers().size()).isZero(); assertThat(request.url().toString()).isEqualTo("http://example.com/foo/bar/"); RequestBody body = request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String bodyString = buffer.readUtf8(); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"ping\"") .contains("\r\npong\r\n--"); }
@Test public void multipartPartsShouldBeInOrder() throws IOException { class Example { @Multipart @POST("/foo") Call<ResponseBody> get(@Part("first") String data, @Part("second") String dataTwo, @Part("third") String dataThree) { return null; } } Request request = buildRequest(Example.class, "firstParam", "secondParam", "thirdParam"); MultipartBody body = (MultipartBody) request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String readBody = buffer.readUtf8(); assertThat(readBody.indexOf("firstParam")).isLessThan(readBody.indexOf("secondParam")); assertThat(readBody.indexOf("secondParam")).isLessThan(readBody.indexOf("thirdParam")); }
@Test public void implicitMultipartForbidden() { class Example { @POST("/") // Call<ResponseBody> method(@Part("a") int a) { return null; } } try { buildRequest(Example.class); fail(); } catch (IllegalArgumentException e) { assertThat(e).hasMessage( "@Part parameters can only be used with multipart encoding. (parameter #1)\n for method Example.method"); } }
@Test public void simpleMultipart() throws IOException { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("ping") String ping, @Part("kit") RequestBody kit) { return null; } } Request request = buildRequest(Example.class, "pong", RequestBody.create( MediaType.parse("text/plain"), "kat")); assertThat(request.method()).isEqualTo("POST"); assertThat(request.headers().size()).isZero(); assertThat(request.url().toString()).isEqualTo("http://example.com/foo/bar/"); RequestBody body = request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String bodyString = buffer.readUtf8(); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"ping\"\r\n") .contains("\r\npong\r\n--"); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"kit\"") .contains("\r\nkat\r\n--"); }
@Test public void multipartArray() throws IOException { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("ping") String[] ping) { return null; } } Request request = buildRequest(Example.class, new Object[] { new String[] { "pong1", "pong2" } }); assertThat(request.method()).isEqualTo("POST"); assertThat(request.headers().size()).isZero(); assertThat(request.url().toString()).isEqualTo("http://example.com/foo/bar/"); RequestBody body = request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String bodyString = buffer.readUtf8(); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"ping\"\r\n") .contains("\r\npong1\r\n--"); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"ping\"") .contains("\r\npong2\r\n--"); }
@Test public void multipartOkHttpIterablePart() throws IOException { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part List<MultipartBody.Part> part) { return null; } } MultipartBody.Part part1 = MultipartBody.Part.createFormData("foo", "bar"); MultipartBody.Part part2 = MultipartBody.Part.createFormData("kit", "kat"); Request request = buildRequest(Example.class, Arrays.asList(part1, part2)); assertThat(request.method()).isEqualTo("POST"); assertThat(request.headers().size()).isZero(); assertThat(request.url().toString()).isEqualTo("http://example.com/foo/bar/"); RequestBody body = request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String bodyString = buffer.readUtf8(); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"foo\"\r\n") .contains("\r\nbar\r\n--"); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"kit\"\r\n") .contains("\r\nkat\r\n--"); }
@Test public void multipartOkHttpArrayPart() throws IOException { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part MultipartBody.Part[] part) { return null; } } MultipartBody.Part part1 = MultipartBody.Part.createFormData("foo", "bar"); MultipartBody.Part part2 = MultipartBody.Part.createFormData("kit", "kat"); Request request = buildRequest(Example.class, new Object[] { new MultipartBody.Part[] { part1, part2 } }); assertThat(request.method()).isEqualTo("POST"); assertThat(request.headers().size()).isZero(); assertThat(request.url().toString()).isEqualTo("http://example.com/foo/bar/"); RequestBody body = request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String bodyString = buffer.readUtf8(); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"foo\"\r\n") .contains("\r\nbar\r\n--"); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"kit\"\r\n") .contains("\r\nkat\r\n--"); }
@Test public void multipartIterable() throws IOException { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("ping") List<String> ping) { return null; } } Request request = buildRequest(Example.class, Arrays.asList("pong1", "pong2")); assertThat(request.method()).isEqualTo("POST"); assertThat(request.headers().size()).isZero(); assertThat(request.url().toString()).isEqualTo("http://example.com/foo/bar/"); RequestBody body = request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String bodyString = buffer.readUtf8(); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"ping\"\r\n") .contains("\r\npong1\r\n--"); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"ping\"") .contains("\r\npong2\r\n--"); }
@Test public void multipartWithEncoding() throws IOException { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part(value = "ping", encoding = "8-bit") String ping, @Part(value = "kit", encoding = "7-bit") RequestBody kit) { return null; } } Request request = buildRequest(Example.class, "pong", RequestBody.create( MediaType.parse("text/plain"), "kat")); assertThat(request.method()).isEqualTo("POST"); assertThat(request.headers().size()).isZero(); assertThat(request.url().toString()).isEqualTo("http://example.com/foo/bar/"); RequestBody body = request.body(); Buffer buffer = new Buffer(); body.writeTo(buffer); String bodyString = buffer.readUtf8(); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"ping\"\r\n") .contains("Content-Transfer-Encoding: 8-bit") .contains("\r\npong\r\n--"); assertThat(bodyString) .contains("Content-Disposition: form-data;") .contains("name=\"kit\"") .contains("Content-Transfer-Encoding: 7-bit") .contains("\r\nkat\r\n--"); }
@Test public void multipartPartOptional() { class Example { @Multipart // @POST("/foo/bar/") // Call<ResponseBody> method(@Part("ping") RequestBody ping) { return null; } } try { buildRequest(Example.class, new Object[] { null }); fail(); } catch (IllegalStateException e) { assertThat(e.getMessage()).isEqualTo("Multipart body must have at least one part."); } }
/** * 上传文件 * @param url * @param headerMap * @param paramPartList * @return */ @Multipart @POST Call<ResponseBody> executeUpload( @Url String url, @HeaderMap Map<String, String> headerMap, @Part() List<MultipartBody.Part> paramPartList );
@POST("user/regist/person") @Multipart Flowable<ResponseDto<User>> regPerson( @PartMap Map<String, RequestBody> param, @Part MultipartBody.Part front, @Part MultipartBody.Part back );
@POST("ad/new") @Multipart Flowable<ResponseDto<User>> add( @PartMap Map<String, RequestBody> param, @Part MultipartBody.Part adFile, @Part MultipartBody.Part coverFile );
@Headers({ "User-Agent: Mozilla/5.0", "accept-language:zh-CN,zh;q=0.8" }) @Multipart// 参数的类型都应该是RequestBody,不然上传的图片的时候会报JSON must start with an array or an object错误 @POST("parse/image/") Observable<OcrItem> uploadImage(@Part("apikey")String key , @Part("fileName") String description, @Part("file\"; filename=\"image.png\"") RequestBody imgs);
@Multipart @POST("pictureup/uploadshitu") Observable<ProgressBean<String>> uploadPic( @Part("pos") String pos, @Part("uptype") String uptype, @Part("fm") String index, @Part("image\"; filename=\"xxx.jpg") File image );
@Multipart @POST("api/v1/upload-book/") Call<Upload.UploadBookRespond> uploadFile(@Part("user_token") RequestBody userToken, @Part("book_name") RequestBody bookName, @Part("author") RequestBody authorName, @Part("category") RequestBody categoryName, @Part("about") RequestBody aboutBook, @Part("language") RequestBody languageBook, @Part("private_book") boolean private_book, @Part MultipartBody.Part file, @Part MultipartBody.Part cover);
public static MultipartBody.Part generateMultiPart(String parName,File file,RequestBodyWrapper uploadFileRequestBody){ return MultipartBody.Part.createFormData(parName, file.getName(),uploadFileRequestBody); }
@Multipart @POST("api/upload/android") Observable<BasicResponse<List<UploadModel>>> uploadFile(@Part("pic\"; filename=\"image1.png") RequestBody file);
@Multipart @POST Observable<ResponseBody> uploadFile(@Url String url, @Part MultipartBody.Part file);
@Multipart @POST("/images/upload") Call<Response> uploadImage(@Part MultipartBody.Part image);
@Multipart @POST Call<String> upload(@Url String url, @Part MultipartBody.Part file);