改装表格数据

时间:2019-02-09 18:55:53

标签: android retrofit2

我试图到达一个需要表单数据的端点,而邮递员可以通过以下命令获得200,请注意,我已将URL替换为/url,将api键替换为key ,使用host的主机和使用referrer的引荐来源网址,但它们都是准确的,并且在两种情况下都匹配。

当看邮递员生成的代码时,我会看到

POST /url?api_key=key HTTP/1.1
Host: host
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Referer: referrer
cache-control: no-cache
Postman-Token: 00ad8c82-be8a-4c0d-a79b-fd7e3e941430

Content-Disposition: form-data; name="user[first_name]"

first

Content-Disposition: form-data; name="user[last_name]"

last

Content-Disposition: form-data; name="user[email]"

flast@gmail.com

Content-Disposition: form-data; name="user[terms_and_conditions]"

1
------WebKitFormBoundary7MA4YWxkTrZu0gW--

但是,通过翻新,我不断收到422,并且来自Stetho的请求看起来像这样

Request URL: /url?api_key=key
Request Method:POST
Request Headers
Provisional headers are shown
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip
Connection:Keep-Alive
Content-Length:563
Content-Type:multipart/form-data;
Host: host
Referer: referrer
User-Agent:okhttp/3.10.0
Query String Parameters
api_key: key
Request Payload
--b9048dea-56eb-4fad-8436-b1d70b753bb1
Content-Disposition: form-data; name="user[first_name]"
Content-Length: 5

first
--b9048dea-56eb-4fad-8436-b1d70b753bb1
Content-Disposition: form-data; name="user[last_name]"
Content-Length: 4

last
--b9048dea-56eb-4fad-8436-b1d70b753bb1
Content-Disposition: form-data; name="user[email]"
Content-Length: 15

flast@gmail.com 
--b9048dea-56eb-4fad-8436-b1d70b753bb1
Content-Disposition: form-data; name="user[terms_and_conditions]"
Content-Length: 1

1
--b9048dea-56eb-4fad-8436-b1d70b753bb1--

我尝试使用多部分请求正文

@POST("/url")
  @Headers(
    "Accept: application/json, text/javascript, */*; q=0.01",
    "Content-Type: multipart/form-data;",
    "Referer: referrer"
  )
  fun signUp(
    @Query("api_key") apiKey: String,
    @Body requestBody : RequestBody
  ): Single<NetworkResponse<AuthResponse, Error>>

我还尝试使用@PartMap(具有相同的标题)

@Multipart
  fun signUp(
    @Query("api_key") apiKey: String,
    @PartMap map: Map<String, String>
  ): Single<NetworkResponse<AuthResponse, Error>>

最后,我尝试在服务中使用多个@Part字段(具有相同的标题)

@Multipart
  fun signUp(
    @Query("api_key") apiKey: String,
    @Part("user[first_name") firstName: RequestBody,
    @Part("user[first_name") lastName: RequestBody,
    @Part("user[first_name") email: RequestBody,
    @Part("user[first_name") toc: RequestBody
  ): Single<NetworkResponse<AuthResponse, Error>>

这些选项似乎都不起作用,或者给我的结果与Postman相同。我看到的区别是,这些部分的内容长度经过改进,并且之间存在这些随机字符串分隔符。

我不拥有api,因此无法更改它。

编辑我按照以下答案中的说明删除了Content-Length,但仍然得到422。输出现在看起来像这样,带有相同的标题。所以似乎最后剩下的区别是那些随机字符串

--5d70bd2c-10e7-4444-84bc-aab7cb3e86ee
Content-Disposition: form-data; name="user[first_name]"

Zachary 
--5d70bd2c-10e7-4444-84bc-aab7cb3e86ee
Content-Disposition: form-data; name="user[last_name]"

sweigart
--5d70bd2c-10e7-4444-84bc-aab7cb3e86ee
Content-Disposition: form-data; name="user[email]"

zsweigart@gmail.com 
--5d70bd2c-10e7-4444-84bc-aab7cb3e86ee
Content-Disposition: form-data; name="user[terms_and_conditions]"

1
--5d70bd2c-10e7-4444-84bc-aab7cb3e86ee--

1 个答案:

答案 0 :(得分:0)

也许这会对您有所帮助。 Workaround how to remove content-length.