android - 如何在改造中发布 x-www-form-urlencoded

标签 android rest retrofit2

我有登录API的请求

Call<TokenJSONModel> login(@Header("Authorization") CredentialsModel credentials, @Field("access_token") String authKey );

authKey 是 x-www-form-urlencoded

所以我加了 @FormUrlEncodedPOST 之前,但仍然收到 400 Bad Request

我双重检查了 adres,调试中的参数是带有“Basic”前缀的 corect credentialsauthKey 没有 access_token 前缀。

在 postman 中一切正常,我收到 tokenuser

我试过:

Call<TokenJSONModel> call = RetrofitClient.getInstance().getApi().login(credentials, "access_token:"+authKey));

但没有任何改变。

在错误的凭据或 token 上,我应该收到 401 unauthorized,永远是 201 Created

来自 api 的日志:

2019-06-04T19:17:06.796534+00:00 app[web.1]: POST /auth 400 0.477 ms - -
2019-06-04T19:17:07.068321+00:00 heroku[router]: at=info method=POST path="/auth" my_webserver.com request_id=5c4efe45-5d54-4fde-8420-d0fcb3338558 fwd="148.81.117.54" dyno=web.1 connect=1ms service=3ms status=400 bytes=188 protocol=https
2019-06-04T19:17:07.069147+00:00 app[web.1]: POST /auth 400 0.519 ms - -
2019-06-04T19:17:17.711709+00:00 app[web.1]: POST /auth 201 43.530 ms - 393
2019-06-04T19:17:17.713351+00:00 heroku[router]: at=info method=POST path="/auth" my_webserver.com request_id=3ff2fdea-c23b-40ef-8f62-acc410068007 fwd="148.81.117.54" dyno=web.1 connect=0ms service=45ms status=201 bytes=662 protocol=https

第一个是针对 android 改造请求,第二个来自 postman 。 我注意到 android 请求比 postman 请求小 3.5 倍 - 为什么?

最佳答案

好的,我找到了解决方案。 添加后

    @Headers({
            "Content-Type: application/x-www-form-urlencoded",
            "accept-encoding: gzip, deflate",
            "access_token: mtlNzTVmXP4IBSba3z4XXXX",
            "Authorization: Basic a2FtaWwua2ljaW5za2lAc3R1ZGVudC53YXQuZXXX"
    })
    @FormUrlEncoded
    @POST("/auth")

我注意到一切正常。当服务器只需要字符串时,我在请求中传递的凭据被视为对包含字符串的 CredentialsModel 对象的引用。我通过以下方式修复了它:

    @FormUrlEncoded
    @POST("/auth")
    Call<ResponseBody> login(@Header("Authorization") String credentials, @Field("access_token") String authKey );

Call<ResponseBody> call = RetrofitClient.getInstance().getApi().login(Credentials.basic(email, password),authKey);

关于android - 如何在改造中发布 x-www-form-urlencoded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56446605/

相关文章:

android - 从数据库+网络加载数据(Room + Retrofit + RxJava2)

android - 了解 Android 架构组件示例 GithubBrowserSample : ViewModelModule, ViewModel 参数

Android - 离线、非矢量、自定义 map

java - 处理 REST API 中的特殊字符

http - HTTP 删除操作失败的 HTTP 响应代码是什么?

c++ - Delphi/C++Builder 10.2.3 RESTRequest POST

java - 解析从蓝牙 HDP 设备接收到的原始数据

android - 在服务器上调用 Web 服务时使用安全性的最佳方式

android - Mock Retrofit 错误 okhttp3.ResponseBody$1 无法转换

java - 我在 Retrofit 中得到奇怪的响应,协议(protocol)=http/1.1,代码=200