标签: retrofit2

带有嵌套值的 JSON 到 POJO

所以我有这样的json响应:

"data": [
    {
        "id": 11881,
        "date": "2018-03-26T16:22:08",
        "date_gmt": "2018-03-26T14:22:08",
        "guid": {
            "rendered": "http://google.com"
        },
        "modified": "2018-03-26T16:22:08",
        "modified_gmt": "2018-03-26T14:22:08",
        "slug": "some text",
        "status": "some status",
        "type": "post",
        "link": "http://google.com",
        "title": {
            "rendered": "some title"
        }
}
]
Run Code Online (Sandbox Code Playgroud)

如果我有这样的类,我如何解析对 POJO 类的这种响应:

public class Response{
    private List<Post> data;
}

public class Post{
    private String id;
    private String date;
    private String date_gmt;
    private String guid;
}
Run Code Online (Sandbox Code Playgroud)

问题是它有像 guid 和 title 这样的嵌套值,我如何将它解析为一个 POJO 类,我不需要为每个嵌套值创建 pojo ?

java android json retrofit2

1
推荐指数
1
解决办法
6874
查看次数

在 recyclerview 中使用 ViewModel 和 Retrofit 实现无限滚动

在添加 viewmodel 和 livedata 之前,我通过改造成功实现了无限滚动。但是在使用 Retrofit 添加 viewmodel 和 livedata 后,我无法使用新数据调用更新 recyclerview 或 viewmodel 观察者不更新列表。

我只是想像我之前的代码那样无限滚动。我添加了一个全局变量来重用下一页令牌。我是否缺少任何东西或任何示例来实现具有视图模型和改造的无限回收器视图将很棒。

public static String NEXT_PAGE_URL = null;
Run Code Online (Sandbox Code Playgroud)

我是这样编码的。

我的活动 -> PlaceListActivity

placeRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            LogMe.d(tag, "onScrollStateChanged:: " + "called");
            // check scrolling started or not
            if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                isScrolling = true;
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            LogMe.d(tag, "onScrolled:: " + "called");
            super.onScrolled(recyclerView, dx, dy);

            currentItem = …
Run Code Online (Sandbox Code Playgroud)

infinite-scroll android-recyclerview retrofit2 android-viewmodel android-jetpack

1
推荐指数
1
解决办法
2287
查看次数

找不到 Kotlin 改造上传图片

我正在尝试从图库中发送照片,但出现错误指示找不到图像

请求甚至不去服务器

在片段中

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == Activity.RESULT_OK) {
        when (requestCode) {
            REQUEST_SELECT_IMAGE_IN_ALBUM -> {
                val contentURI = data!!.data
                postServer(contentURI)

            }
        }
    }
}

private fun postServer(contentURI: Uri) {

    val MEDIA_TYPE_IMAGE: MediaType = MediaType.parse("image/*")!!
    val file = File(contentURI.path)
    val requestBody: RequestBody = RequestBody.create(MEDIA_TYPE_IMAGE, file)
    mercrediViewModel.uploadImage(enfant, requestBody)
}
Run Code Online (Sandbox Code Playgroud)

在我的模型中

fun uploadImage(enfant: Enfant, requestBody: RequestBody) {
    viewModelScope.launch {

        val request = mercrediService.uploadImage("****", enfant.id, requestBody)
        request.enqueue(object : Callback<ResponseBody> {
            override fun onFailure(call: …
Run Code Online (Sandbox Code Playgroud)

android kotlin retrofit2

1
推荐指数
1
解决办法
4690
查看次数

NodeJS - 强大的 200 MB 文件限制和崩溃

我有 nodejs 服务器:

var http = require('http');
var formidable = require('formidable');
var fs = require('fs');
http.createServer(function (req, res) {
  if (req.url == '/fileupload') {
    console.log(req.rawHeaders)
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
      if (err) throw err;
      var oldpath = files.file.path
      var newpath = 'C:/VSI/' + files.file.name;
      fs.rename(oldpath, newpath, function (err) {
        //if (err) throw err;
        //res.write('File uploaded and moved!');
        if (err) {
          res.write(JSON.stringify({
            success: false,
            message: 'error happend'
          })
          );
          res.end()
          throw err;
        }

        res.write(JSON.stringify({
          success: …
Run Code Online (Sandbox Code Playgroud)

networking node.js formidable retrofit2

1
推荐指数
1
解决办法
3188
查看次数

如何使用注释在改造请求中动态添加授权标头?

实际上,我在我的 Android 应用程序中使用了 Retrofit 2(我使用的是 Kotlin),并且我想执行如下所示的发布请求:

@Headers("Authorization: Bearer: $Constants.TOKEN")
@POST("/task")
fun createTask(object:Object)
Run Code Online (Sandbox Code Playgroud)

当令牌是常量时,请求工作得很好,但我希望它是动态的。

经过多次搜索,我找到了如下解决方案:

@POST("/task")
fun createTask(@Header("Authorization: Bearer") authorization:String, object:Object)
Run Code Online (Sandbox Code Playgroud)

或者

@POST("/task")
fun createTask(@HeaderMap header:Map<String, String>, object:Object)
Run Code Online (Sandbox Code Playgroud)

当我尝试时,我得到了如下错误:

bad request : error at char 0x20 
Run Code Online (Sandbox Code Playgroud)

android kotlin retrofit2

1
推荐指数
1
解决办法
4378
查看次数

签名 APK 中的空响应 - 调试 APK 中的正确响应

我正在使用 Retrofit 进行网络调用。

我正面临签名 APK 的奇怪问题。

改造请求,

@FormUrlEncoded
@Headers("Accept: application/json")
@POST("******")
Call<UserInfoResponse> authenticateUser(@Field("umMobileNumber") String websiteId,
                                    @Field("spPassword") String loginSource);
Run Code Online (Sandbox Code Playgroud)

在上述请求的响应中,我得到了正确的响应,如果我在调试版本上运行它。

但同样的事情,如果我使用签名 APK,我在响应中得到一个空对象。

下面回复,

{
"isValid": true,
"accessToken": "",
"isValidToken": true,
"serviceBean": {
    },
"customerExist": false,
"singleSessionFlag": false
 }
Run Code Online (Sandbox Code Playgroud)

在 Singed Apk 中,我将 serviceBean 设为 null。

在谷歌上没有得到任何解决方案。

有人可以帮我解决这个问题吗?

debugging android json apk retrofit2

1
推荐指数
1
解决办法
1188
查看次数

以特定格式传递查询日期参数

在我的 android 应用程序中,我使用 Retrofit 2

@GET("/operations")
    fun getOperationsList(
        @Query("types") typeList: List<@JvmSuppressWildcards OperationType>,
        @Query("status") statusList: List<@JvmSuppressWildcards OperationStatus>,
        @Query("from") from: Date, @Query("to") to: Date
    ): Call<List<Operation>>
Run Code Online (Sandbox Code Playgroud)

这里结果 http 请求:

08-06 15:40:17.672 D/OkHttp  ( 2436): --> GET http://my_ip:8081/operations?types=payment&types=payout&status=executed&from=Tue%20Aug%2006%2015%3A40%3A17%20GMT%2B03%3A00%202019&to=Tue%20Aug%2006%2015%3A40%3A17%20GMT%2B03%3A00%202019 http/1.1
Run Code Online (Sandbox Code Playgroud)

但我需要以from, to这种格式传递日期参数():

YYYY-MM-ddTHH:mm:ss.Z
Run Code Online (Sandbox Code Playgroud)

例子:

https://some_host/operations?types=transfer&types=payment&status=executed&from=2018-07-01T19%3A13%3A51.418Z&to=2019-08-05T11%3A04%3A22.397Z
Run Code Online (Sandbox Code Playgroud)

在 Retrofit 2 中有可能吗?

android datetime-format retrofit2

1
推荐指数
1
解决办法
1591
查看次数

Okhttp 身份验证器 addHeader() 与 header()

在使用拦截器和身份验证器添加访问令牌标头时,当服务器以 401 响应时,我的身份验证器会被正确调用。

身份验证器通过单独的网络调用更新访问令牌,并将其设置在标头中以再次尝试。代码将与此示例非常相似

我只花了一个小时搞清楚我用错误的方法来再度令牌添加到认证,addHeaderVSheader

作品:

if (accessToken != null){
   // retry the failed 401 request with new access token
   return response.request().newBuilder()
                            .header("Authorization", accessToken) // use the new access token
                            .build();
}
Run Code Online (Sandbox Code Playgroud)

不起作用:

if (accessToken != null){
   // retry the failed 401 request with new access token
   return response.request().newBuilder()
                            .addHeader("Authorization", accessToken) // use the new access token
                            .build();
}
Run Code Online (Sandbox Code Playgroud)

这里会发生什么,为什么addHeader()行为与header()

android restful-authentication okhttp retrofit2

1
推荐指数
1
解决办法
407
查看次数

迁移到androidX后,发布版本中的OkHttp帖子内容为空

在迁移到 androidX 之前,发布版本适用于每个 HTTP 请求。

迁移到 androidX 后,每个GET请求都有效,但所有POST请求都无效。它无法向服务器端发送参数。POST请求的所有内容都是空的。

我所做的唯一更改是将此项目迁移到 androidX。

我不确定在哪里可以找到更多的见解... :(

[更新]:通过kushan评论推荐添加接口和POJO :)

界面

@POST("/api/preference")
Call<RoasterPreference> updatePreference(@Body RoasterPreference roasterPreference);
Run Code Online (Sandbox Code Playgroud)

POJO 对象

import com.google.gson.annotations.SerializedName;

public class RoasterPreference {

  @SerializedName("type")
  private String type;

  @SerializedName("value")
  private String value;

  public RoasterPreference(String _type,String _value){

    type = _type;
    value = _value;
  }
} 
Run Code Online (Sandbox Code Playgroud)

来自调试版本的 OkHttp 日志:

D/OkHttp: --> POST http://192.168.0.1:9999/api/preference
Content-Type: application/json; charset=UTF-8
Content-Length: 29
{"type":"t_unit","value":"0"}
--> END POST (29-byte body)
Run Code Online (Sandbox Code Playgroud)

发布版本中的 OkHttp 日志:

D/OkHttp: --> POST …
Run Code Online (Sandbox Code Playgroud)

android android-studio okhttp retrofit2 androidx

1
推荐指数
1
解决办法
857
查看次数

java.lang.RuntimeException:无法在没有参数的情况下调用公共 io.reactivex.Observable()

您好,我目前正在准备一个带有协程的 MVVM 的简单演示示例,我面临以下问题。请查看代码以及代码有什么问题。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.android.mvvmcoroutine.development, PID: 18974
    java.lang.RuntimeException: Failed to invoke public io.reactivex.Observable() with no args
        at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:113)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:212)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:121)
        at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
     Caused by: java.lang.InstantiationException: Can't instantiate abstract class io.reactivex.Observable
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:110)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:212) 
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39) 
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27) 
        at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225) 
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:121) 
        at okhttp3.RealCall$AsyncCall.run(RealCall.kt:138) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
        at java.lang.Thread.run(Thread.java:919)
Run Code Online (Sandbox Code Playgroud)

依赖配置

'rxJavaVersion'           : 'io.reactivex.rxjava2:rxjava:2.1.15'
'rxAndroidVersion'        : 'io.reactivex.rxjava2:rxandroid:2.1.1' …
Run Code Online (Sandbox Code Playgroud)

android kotlin dagger-2 retrofit2 rx-java2

1
推荐指数
1
解决办法
1037
查看次数