Как получить данные, отправленные с клиента - PullRequest
1 голос
/ 10 ноября 2019

Я пытаюсь отправить данные (запрос POST) из приложения для Android с помощью библиотеки retrofit2 и получить их на сервере, который написан на nodejs (с использованием экспресс-фреймворка), но я не могу получить данные, отправленные изapp.

Я использовал модификацию с GsonConverterfactory и отправил запрос POST на маршрут "/ temp".

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 : "Got the message ",
        address : "on the server"
    }
    res.json(obj);
})

app.listen(8000,function(){
    console.log("Server Started at port 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<Shop> 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<Shop> shopCall = shopApi.create(shop);
    shopCall.enqueue(new Callback<Shop>() {
        @Override
        public void onResponse(Call<Shop> call, Response<Shop> 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<Shop> call, Throwable t) {
            Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
        }
    });
}

Ожидается объект jsonв req.body, который должен быть напечатан в терминале, но это будет напечатано: -

Server Started at port 8000
{}

Пожалуйста, помогите мне получить данные на сервере.

1 Ответ

0 голосов
/ 11 ноября 2019

Я не работаю в Node.js, но все же пытаюсь ответить на ваш вопрос.

Вы ожидаете JSON-объект на сервере, как показано ниже,

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

Хорошо, вашЧасть Android (Retrofit api interface) верна. Во время выполнения он производит ожидаемый объект JSON. Но на стороне вашего сервера вы принимаете application/x-www-form-urlencoded вместо application/json данных. Что вызывает эту проблему IMO.

Просто замените следующий код с

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

на

app.use(bodyParser.json());

и попробуйте один раз!

body-parser doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...