所以我有这样的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 ?
在添加 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
我正在尝试从图库中发送照片,但出现错误指示找不到图像
请求甚至不去服务器
在片段中
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) 我有 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) 实际上,我在我的 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) 我正在使用 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。
在谷歌上没有得到任何解决方案。
有人可以帮我解决这个问题吗?
在我的 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 中有可能吗?
在使用拦截器和身份验证器添加访问令牌标头时,当服务器以 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()
在迁移到 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) 您好,我目前正在准备一个带有协程的 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)