如何接收客户端发送的数据

8 浏览
0 Comments

如何接收客户端发送的数据

我正在尝试使用retrofit2库从Android应用程序发送数据(POST请求),并在使用nodejs编写的服务器上接收它(使用express框架),但我无法检索从应用程序发送的数据。
我使用了带有GsonConverterfactory的retrofit,并向“/temp”路由发送了一个POST请求。

Index.js(处理路由请求):-

var express = require("express");
var bodyParser = require("body-parser");
var app = express();
app.use(bodyParser.urlencoded({extended:true}));
app.use('/public',express.static('public'));
app.post("/temp",function(req,res){
    console.log(req.body);
    obj = {
        orgName : "收到消息",
        address : "在服务器上"
    }
    res.json(obj);
})
app.listen(8000,function(){
    console.log("服务器启动,端口号8000");
})

Shop.java

package com.example.myapplication;
public class Shop {
    private String orgName;
    private String address;
    public Shop(String orgName, String address) {
        this.orgName = orgName;
        this.address = address;
    }
    public String getOrgName() {
        return orgName;
    }  
    public String getAddress() {
        return address;
    }
}

ShopApi.java

package com.example.myapplication;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface ShopApi {
    @POST("temp")
    Call create(@Body Shop shop);
}

postData() - 从MainActivity.java中发送数据的方法

public void postData(View view){
    String BASE_URL = "http://10.0.2.2:8000/";
    String org = orgName.getText().toString();
    String address = add.getText().toString();
    //Toast.makeText(getApplicationContext(),org+" "+address,Toast.LENGTH_SHORT).show();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    ShopApi shopApi = retrofit.create(ShopApi.class);
    Shop shop = new Shop(org,address);
    Call shopCall = shopApi.create(shop);
    shopCall.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            if(!response.isSuccessful()){
                Toast.makeText(getApplicationContext(),response.code(),Toast.LENGTH_LONG).show();
            }
            Shop shopResponse = response.body();
            String content = shopResponse.getOrgName() + shopResponse.getAddress();
            Toast.makeText(getApplicationContext(),content,Toast.LENGTH_SHORT).show();
        }
        @Override
        public void onFailure(Call call, Throwable t) {
            Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
        }
    });
}


在req.body中期望一个json对象,应该将其打印到终端,但实际上打印出的是:

服务器启动,端口号8000
{}


请帮助我在服务器上检索数据。

0
0 Comments

问题的原因是在服务器端接受了application/x-www-form-urlencoded类型的数据,而不是application/json类型的数据。解决方法是替换服务器端的代码,将app.use(bodyParser.urlencoded({extended:true}));替换为app.use(bodyParser.json());

文章内容如下:

我虽然不在Node.js中工作,但我还是尝试回答你的问题。你期望在服务器端接收到以下JSON对象:

{
   "orgName": "Organization name",
   "address": "Organization address"
}

好的,你的Android部分(Retrofit API接口)是正确的。在运行时,它会生成预期的JSON对象。但是,在服务器端,你接受的是application/x-www-form-urlencoded类型的数据,而不是application/json类型的数据。这可能是导致问题的原因。

只需将以下代码从:

app.use(bodyParser.urlencoded({extended:true}));

替换为:

app.use(bodyParser.json());

然后尝试一下!

body-parser 文档

我有一个问题,你能回答吗?我在Stack Overflow上发布了这个问题,但显示问题已关闭。

首先搜索解决方案并尝试一次。如果你找不到任何解决方案,或者自己无法解决,就在StackOverflow上以适当的最小可复现示例提出一个新问题。即使不是我,其他StackOverflow的用户也会尝试帮助你。祝你好运!(如果问题太小,你可以在这里提问,我会尝试给你提供答案的链接)

我正在开发一个Android应用的想法,需要根据用户输入生成图像。有没有可以帮助的库?图像可以在手机上生成吗?如果可以,怎么做?还是只能在服务器上生成然后发送到客户端应用程序?我发现一些使用HTML画布的答案,但我认为当目标用户数量庞大时,这种方法不可取,因为它会很慢、容易出错且不可靠。所以我应该怎么做,考虑到网络速度、用户数量和可靠性等因素?

你想生成什么样的图像?比如签名之类的吗?

像收据、账单或发票等这些类型的图像。

说实话,我从未尝试过这样的代码。你需要准备你想要打印的账单格式,并相应地设置数据。更简单的方法是使用外部打印机(蓝牙打印机)。他们还提供示例代码。但是在这种情况下你不能生成图像。并且我看到你的问题被搁置了,因为对于StackOverflow来说,这个问题回答起来太宽泛了。

0