如何使用Retrofit发送multipart/form-data?

10 浏览
0 Comments

如何使用Retrofit发送multipart/form-data?

我想从Android客户端向REST服务器发送一篇文章。这是服务器上的Python模型:

class Article(models.Model):
    author = models.CharField(max_length=256, blank=False)
    photo = models.ImageField()

以下接口描述了先前的实现:

@POST("/api/v1/articles/")
public Observable createArticle(
        @Body Article article
);

现在我想通过文章数据发送一张图片。在Android客户端上,`photo`字段不是Article模型的一部分。

@Multipart
@POST("/api/v1/articles/")
public Observable createArticle(
        @Part("article") Article article,
        @Part("photo") TypedFile photo
);

API已准备好并通过cURL成功测试。

$ curl -vX POST http://localhost:8000/api/v1/articles/ \
    -H "Content-Type: multipart/form-data" \
    -H "Accept:application/json" \
    -F "author=cURL" \
    -F "photo=@/home/user/Desktop/article-photo.png"

当我通过Android客户端的`createArticle()`方法发送数据时,我收到一个HTTP 400状态,指示字段是必需的/缺失的

D  <--- HTTP 400 http://192.168.1.1/articles/ (2670ms)
D  Date: Mon, 20 Apr 2015 12:00:00 GMT
D  Server: WSGIServer/0.1 Python/2.7.8
D  Vary: Accept, Cookie
D  X-Frame-Options: SAMEORIGIN
D  Content-Type: application/json
D  Allow: GET, POST, HEAD, OPTIONS
D  OkHttp-Selected-Protocol: http/1.0
D  OkHttp-Sent-Millis: 1429545450469
D  OkHttp-Received-Millis: 1429545453120
D  {"author":["This field is required."],"photo":["No file was submitted."]}
D  <--- END HTTP (166-byte body)
E  400 BAD REQUEST

这是服务器端接收到的`request.data`:

ipdb> print request.data  
  ]}>

我应该如何将Article对象转换为符合多部分的数据类型?我阅读到Retrofit可能允许使用Converters来实现这一点。根据我理解的文档,它应该是实现了一个`retrofit.mime.TypedOutput`的东西。

Multipart部分使用`RestAdapter`的converter或者它们可以实现`TypedOutput`来处理自己的序列化。

相关

0