一、Http请求格式
- 请求方法 URI 协议/版本
- 请求头(Request Header)
- 请求正文
(1)请求头
注:第一行表示请求方式、url、http版本
(2)请求正文
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。
这个请求体是多个相同的部分组成的:每一个部分都是以–加分隔符开始的(第一个部分),然后是该部分内容的描述信息,然后一个回车,然后是描述信息的具体内容(“child”);如果传送的内容是一个文件的话(第二个部分),那么还会包含文件名信息,以及文件内容的类型(“multipart/form-data”)。
二、带参
上传图片
(1)第一种形式
(有问题的接口定义)
public interface Upload{
@Multipart
@POST("/upload/pic.go")
Observable<BaseEntity<String>> uploadPic(@Part("type") String type, @Part MultipartBody.Part part);
}
File file = new File(Environment.getExternalStorageDirectory()+"/mouth.jpg");
if (!file.exists()&&file.isFile()) {
return;
}
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part imageBodyPart = MultipartBody.Part.createFormData("pic", "pic", imageBody);
BaseHttpMethod.getInstance().create(Upload.class)
.uploadPic("child",imageBodyPart)
.subscribeOn(Schedulers.io()) //订阅发生在io线程
.observeOn(AndroidSchedulers.mainThread())//订阅者的回调在主线程
.subscribe(new Subscriber<BaseEntity<String>>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(BaseEntity<String> picEntityBaseEntity) {
}
});
抓包截图如下:
type 的Content-Type不能是“application/json”,而是“text/plain”。
@Part("type") String type 在Post请求中默认的Content-Type类型就是“application/json”
正确的两种上传方式:
(1)
public interface Upload{
@Multipart
@POST("/upload/pic.go")
Observable<BaseEntity<String>> uploadPic(@PartMap Map<String,RequestBody> params);
}
File file = new File(Environment.getExternalStorageDirectory()+"/mouth.jpg");
if (!file.exists()&&file.isFile()) {
return;
}
Map<String,RequestBody> params = new HashMap<>();
params.put("type",getRequestBody("child"));
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
// params.put("pic",imageBody);
params.put("pic\"; filename=test\"",imageBody);
BaseHttpMethod.getInstance().create(Upload.class)
.uploadPic(params)
.subscribeOn(Schedulers.io()) //订阅发生在io线程
.observeOn(AndroidSchedulers.mainThread())//订阅者的回调在主线程
.subscribe(new Subscriber<BaseEntity<String>>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(BaseEntity<String> picEntityBaseEntity) {
}
});
public RequestBody getRequestBody(String value){
RequestBody body = RequestBody.create(MediaType.parse("text/plain"),value);
return body;
}
运行打印Log信息如下:
参数的Content-Type改为text/plain
(2)
public interface Upload{
@Multipart
@POST("/upload/pic.go")
Observable<BaseEntity<String>> uploadPic(@Query("type") String type, @Part MultipartBody.Part part);
}
这种方式参数拼在url后面 http://xxxx/upload/pic.go?type=child 进行上传