如何接收客户端发送的数据
如何接收客户端发送的数据
我正在尝试使用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") Callcreate(@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); CallshopCall = 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 {}
请帮助我在服务器上检索数据。
问题的原因是在服务器端接受了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来说,这个问题回答起来太宽泛了。