python Google cloud function 호출하기


우선 먼저 코드를 첨부하겠다. 굉장히 간단하다.

import requests
import json

url = "google cloud function url you want to call"

# some data
data = {
    'apple': "red",
    'banana': 1
    }
    
response = requests.post(url, data = data)

# I get object as a result from function, so I parse data in json format
parsed = json.loads(response.content.decode('utf-8'))
print(parsed["data"])

우선 내가 만든 google cloud function은 request를 받아 response를 return json.dumps({"data":response}), 200, {'Content-Type': 'application/json'}로 응답한다. 따라서 parsed는 object형태로 불러와지고, 나는 파이썬 코드 맨 마지막에서 print(parsed["data"])를 해서 response를 출력한 것이다.

함수가 리턴하는 객체가 있다면 위와 같이 response를 가지고 하고 싶은 작업을 하면 되고, 아니라면 response = requests.post(url, data = data) 까지만 해도 함수는 호출된다.

참고

  • 참고로 google cloud function도 python으로 작성했는데, google cloud function을 호출하는 언어/주체? 에 따라 google cloud function이 받는 request 를 처리해야 하는 방법이 달라진다.

이게 무슨 말이냐면, 내가 google cloud function에 request로 넘겨야 할 객체가 위에 코드에 있는 것과 같이

{
  'apple': "red",
  'banana': 1
}

이라는 객체라고 해보자.

내가 같은 객체를 android studio 에서 kotlin으로 google cloud function에 넘겨주는 거랑 python을 이용해 넘겨주었을 때 각각 google cloud function에서는 객체를 다른 형태로 받는다는 것이다.

우선 kotlin에서는 아래의 코드를 이용해서 객체를 넘겨서 google cloud function을 호출한다고 해보자.

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.deeply.forme.databinding.ActivityMainBinding
import com.google.firebase.functions.FirebaseFunctions
import kotlin.reflect.typeOf

class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "MainActivity"
    }
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        initViews()
    }
    private fun initViews() {
        binding.btnStep1.setOnClickListener {
            Log.d(TAG, "btn1 clicked")

            val data = hashMapOf(
                "apple" to "red",
                "banana" to 1          
                )
            sendData(data)

        }
    }
    private fun sendData(data: Any) {
        FirebaseFunctions.getInstance().getHttpsCallable("function_name")
            .call(data)
            .continueWith { task ->
                var result = task.result?.data as String
            }
    }
}

위와 같이 코드를 짜면 btn1을 클릭하면 sendData라는 함수가 호출되면 google cloud function에 data 객체가 넘어간다. 이 경우 google cloud function에서 객체를 받기 위해서는 아래와 같이 받아야 한다.

request_json = request.get_json(silent=True)

apple = request_json["apple"]
.
.

하지만 맨 위처럼 python에서 data 객체를 보내면 아래와 같이 받아야 한다.

request_data = request.values

apple = request_data["apple"]
.
,