翻新返回未知字符

时间:2019-05-02 07:34:17

标签: android retrofit retrofit2

使用翻新时出现了这个奇怪的错误。

首先,我尝试使用okhttpClient进行比较,并按预期方式获取json结果。

  val requestBody = MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("email", "my.email@email.com")
        .build()

    val request = Request.Builder()
        .url(BASE_URL + "account/forgot")
        .post(requestBody)
        .build()
     var client = OkHttpClient()
    client.newCall(request).execute()
        .use { response ->
            val response = response.body()!!.string()
    }

哪个返回

    {"success": true, "email": "my.email@email.com", "uu_id": "000-0--0-0-000"}

现在使用相同的逻辑,我尝试将其转换为改型,但是跳过了GSON转换,因为它返回了意外错误,提示“ JSON未格式化”

所以我做的是回调,只是根据Retrofit的文档将其作为ResponseBody返回

@Headers("token: ", "accept-language: en-US", "accept: application/json", "accept-encoding: gzip, deflate, br", "Content-Type: application/json")
@POST("account/forgot")
fun resetPasswordDetails(@Body body:String): Call<ResponseBody>

并使用此RetrofitInstance

public static Retrofit getRetrofitInstance() {
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();

    CookieManager cookieManager = new CookieManager();
    cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);

    HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
            .cookieJar(new JavaNetCookieJar(cookieManager))
            .addInterceptor(loggingInterceptor)
            .addInterceptor(new ResponseInterceptor())
            .build();
    if (retrofit == null) {
        retrofit = new retrofit2.Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(defaultHttpClient)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }
    return retrofit;
}

在我的主要活动中,我将其用作

    val service = RetrofitClientInstance.getRetrofitInstance().create(GetDataService::class.java)

    val jsonBody = JSONObject()
    jsonBody.put("email", "my.email@email.com")

    val call = service.resetPasswordDetails(jsonBody.toString())
    val response = call.execute()
    val value = response.body()?.string()

我希望获得与okHttp相同的结果,但返回字符串为

      ���������������-�A
�0E�Rf)M1mc�+o"���)�ED�{��>��>PW"�.ݳ��w��Q����u�Ib�ȃd���x�/\r���@95s)�Eo���h�S����jbc���̚����  �������

改造实例是否出了问题?为什么它可以在okhttp上运行,但不能在翻新版上运行

编辑: 我的问题被标记为重复,但我认为那不是同一个问题。尽管另一个人指出问题与URL编码有关,但我的问题是,为什么okhttpclient和改造未返回相同的JSON

2 个答案:

答案 0 :(得分:0)

可能是您将请求作为JSON正文而不是像OkHTTP请求那样作为多部分发送。

要发出Multipart请求,您可以按以下方式定义改造请求:

@POST("account/forgot")
fun resetPasswordDetails(@Part email:String): Call<ResponseBody>

然后,您可以使用电子邮件地址调用该方法,而无需创建任何JSONObject。

答案 1 :(得分:0)

基于Xavier Rubio Jansana的评论,我删除了一些标题,现在它可以正常工作。我只保留@Headers(“ Content-Type:application / json”)..非常感谢先生