有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

typescript通过POST从Java调用Firebase函数

所以我有一个TypeScript函数,它将文档写入firestore

    exports.register = functions.https.onRequest((req:any, res:any) => {
    if (req.method === 'PUT') {
        res.status(403).send('Forbidden!');
        return;
    }   
    cors(req, res, () => {
        const name = req.query.name;
        //validations
        if (!name) {
            res.status(200).send("Please enter name.");
            return;
        }
        //Other input validations....
    
        const vkey = Math.random()*1000000000000000;
        
        //check if user already exists in firestore
        const userRef = admin.firestore().collection('users')

        let userExists;
        userRef.where('email', '==', email).get()
        .then((snapshot: { size: any; }) => {
            userExists = snapshot.size;
            console.log(`user by email query size ${userExists}`);
            //send error if user exists
            if(userExists && userExists > 0){
                res.status(200).send("Account with the same email exists");
                return;
            }
            //add user to database
            admin.firestore().collection('users').add({
                name: name,
                email: email,
                password: password,
                user: user,
                vkey: vkey,
                verified: 0,
                token: 0
            }).then((ref: { id: any; }) => {
                console.log('add user account', ref.id);
                res.status(200).send("Registered");
                return; 
            });             

        })
        .catch((err: any) => {
            console.log('error getting user by email', err);
            res.status(200).send("System error, please try again.");
        });


    });
});

我需要通过POST请求从java代码中调用这个函数。我已经通过GET实现了这一点,但我必须发送的数据超出了GET的处理能力。(我知道注册函数工作正常,因为我得到了响应,当使用GET和更少的数据进行测试时,它会将文档写入firestore没有问题)我当前实现POST的代码如下所示:

public class UtilsUpdateUser extends AsyncTask<String,Void,String> {
        @Override
        protected String doInBackground(String... urls) {
            try {

                String jsonString = Utils.userToString(Utils.USER);

                String data = URLEncoder.encode("name", "UTF-8") + "=" +
                        URLEncoder.encode(usernameString, "UTF-8");
                data += "&" + URLEncoder.encode("password", "UTF-8") + "=" +
                        URLEncoder.encode(Utils.PASSWORD, "UTF-8");
                data += "&" + URLEncoder.encode("user", "UTF-8") + "=" +
                        URLEncoder.encode(jsonString, "UTF-8");
                data += "&" + URLEncoder.encode("email", "UTF-8") + "=" +
                        URLEncoder.encode(emailString, "UTF-8");

                URL url = new URL(urls[0]);
                URLConnection conn = url.openConnection();
                conn.setDoOutput(true);
                OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
                wr.write(data);
                wr.flush();
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                return sb.toString();
            } catch (Exception e) {
                return "Internet";
            }
        }
        @Override
        protected void onPostExecute(String s) {
            Log.i("MyData",s);
        }
    }

但此代码总是导致“请输入名称”非常感谢您的帮助


共 (1) 个答案

  1. # 1 楼答案

    POST调用是正确的问题是,在我使用的云函数中 req.query.VARIABLE_NAME;如果是POST,这对GET put来说是很好的;sreq.body.VARIABLE_NAME;