gpt4 book ai didi

java - 当通过 Node.js 从 MongoDB 数据库查询项目时,Android 中的 Retrofit 2 导致 Java.io.EOFException

转载 作者:可可西里 更新时间:2023-11-01 10:49:00 26 4
gpt4 key购买 nike

我在尝试使用 Android 项目中的 Retrofit 2 从 mLab 以 JSONArray 的形式同时查询多个 MongoDB 文档时遇到了问题。我尝试查询的文档在其中一个字段中具有相同的值,因此我在我的 Node.js API 中使用了 db.collection.find() 方法。这是 Android 应用程序代码。

 productSubscription.add(ProductNetworkUtil
.getProductRetrofit(myToken).getProductByCategory("Hardware")
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(this::handleProductListResponse,this::handleProductError));

private void handleProductResponse(Product product)
{
String itemName = product.getItemName();
Snackbar.make(findViewById(R.id.content_home_screen), itemName, Snackbar.LENGTH_LONG).show();
int stop = 0;
}
private void handleProductListResponse(JSONArray productList)
{
Snackbar.make(findViewById(R.id.content_home_screen),"Hardware list received",Snackbar.LENGTH_SHORT).show();
int stop = 0;
}
private void handleProductError(Throwable error)
{
if(error instanceof HttpException)
{
Gson gson = new GsonBuilder().create();
try
{
String errorBody = ((HttpException)error).response().errorBody().string();
Response response = gson.fromJson(errorBody,Response.class);
Snackbar.make(findViewById(R.id.content_home_screen),response.getMessage(),Snackbar.LENGTH_SHORT).show();
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
Snackbar.make(findViewById(R.id.content_home_screen),"Network Error!",Snackbar.LENGTH_SHORT).show();
}
}

这是前面代码 fragment 中使用的 ProductNetworkUtil 类,

public class ProductNetworkUtil {
public static Retrofit2ProductInterface getProductRetrofit(String token) {

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

httpClient.addInterceptor(chain -> {

Request original = chain.request();
Request.Builder builder = original.newBuilder()
.addHeader("x-access-token", token)
.method(original.method(),original.body());
return chain.proceed(builder.build());

});

RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io());

return new Retrofit.Builder()
.baseUrl(NewLoginConstants.PRODUCT_FETCHER_URL)
.client(httpClient.build())
.addCallAdapterFactory(rxAdapter)
.addConverterFactory(GsonConverterFactory.create())
.build().create(Retrofit2ProductInterface.class);
}}

这是我一直在使用的接口(interface)类:

enter cpublic interface Retrofit2ProductInterface {

@GET("products/{itemName}")
Observable<Product> getProduct(@Path("itemName") String itemName);

@GET("products/{category}")
Observable<JSONArray> getProductByCategory(@Header("category") String category);}

如果我使用以 itemName 字段作为参数的查询方法,我可以成功查询,因为在数据库中每个文档的 itemName 都是唯一的。但是,getProductByCategory 方法会导致 Java.io.EOFException:调试器中第 1 行第 1 列路径 $ 的输入结束。我搜索了一些答案,有人说这是因为应用程序接收到空数据。所以我也尝试更改 node.js 代码。

    exports.getProductByCategory = category => 

new Promise ((resolve,reject) => {

var productList = product.find({ category: category }, {
_id: 1,
QRCode: 1,
owner: 1,
itemName: 1,
salePrice: 1,
price: 1,
sku: 1,
webCode: 1,
summary: 1,
description: 1,
inTheBox: 1,
warranty: 1,
category: 1,
mainImg: 1,
otherImgs: 1
}).toArray();
product.resolve({productList, message: 'Got your list!'})
.catch(err => reject({ status: 500, message: 'Internal Server Error !' }))

});

这里是node.js API的routes.js中的相关代码

'use strict';

const detail = require('./functions/detail');const config = require('./config/config.json');

module.exports = router => {

router.get('/', (req, res) => res.end('This is the product node!'));

router.get('/products/:id', (req,res) => {
detail.getProduct(req.params.id)
.then(result => res.json(result))
.catch(err => res.status(err.status).json({ message: err.message }));
});

router.get('/products/:category', (req,res) => {
detail.getProductByCategory(req.params.category)
.then(result => res.json(result))
.catch(err => res.status(err.status).json({message: err.message}));
});

我不确定 node.js API 是否存在一些基本的编码错误,或者问题出在 android 查询方法上。

最佳答案

我不能说什么,因为我需要更多信息并自行检查(您的回复数据)。

您是否尝试调试/记录并检查响应内容?看起来是错误的。

关于java - 当通过 Node.js 从 MongoDB 数据库查询项目时,Android 中的 Retrofit 2 导致 Java.io.EOFException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45430694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com