Я пытаюсь сделать простой пост-запрос к диалоговому потоку Google при модернизации, используя kotlin. Я моделирую свой код с этого сайта . Тем не менее, я продолжаю получать 400 ошибок, когда пытаюсь выполнить поиск, поэтому, должно быть, что-то не так с моим интерфейсом, создающим тело сообщения, которое я считаю. У меня работает python код, который выполняет те же функции, что и здесь:
url = "https://api.dialogflow.com/v1/query?v=20170712"
headers = {
'Authorization': 'Bearer ' + my_key ,
'Content-Type' : 'application/json'
}
body = {
'lang': 'en',
'query': 'id like to fix my wire c1000 stocks',
'sessionId': 'me'
}
resp = r.post(url,headers=headers,data=json.dumps(body))
Я настроил это в android studio как 3 класса:
1) Message.kt Тело почтового запроса
object Message {
data class MsgBody(val lang: String, val query: String, val sesId: String)
}
2) Model.kt Ответ из диалогового потока
object Model {
data class Response(val resp: Result)
data class Result(val fulfillment: Fulfillment)
data class Fulfillment(val speech: String)
}
3) DialogFlowService.kt Интерфейс, в котором есть точка отправки почтового запроса
interface DialogFlowService {
@Headers(
"Authorization: Bearer {MY API KEY}",
"Content-Type: application/json"
)
@POST("query")
fun getAiMessage(@Body msg: Message.MsgBody,
@Query("v") v: String): Observable<Model1.Response>
companion object {
fun create(): DialogFlowService {
val retrofit = Retrofit.Builder()
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://api.dialogflow.com/v1/")
.build()
return retrofit.create(DialogFlowService::class.java)
}
}
}
Все это затем используется в моей основной деятельности, как показано ниже:
class MainActivity : AppCompatActivity() {
private var disposable: Disposable? = null
private val dialogFlowService by lazy {
DialogFlowService.create()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
if (editText.text.toString().isNotEmpty()) {
sendMessage(editText.text.toString())
}
}
}
private fun sendMessage(msg: String){
disposable = dialogFlowService.getAiMessage(Message.MsgBody("en",msg,"me"),"20170712")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result -> textView.text = "DialogFlow says: ${result.resp.fulfillment.speech}" },
{ error -> Toast.makeText(this, error.message, Toast.LENGTH_SHORT).show() }
)
}
override fun onPause() {
super.onPause()
disposable?.dispose()
}
}
Я пытался следовать этому уроку как можно ближе и очень растерялся относительно того, что я сделал неправильно. Как я уже говорил выше, я думаю, что это связано с моим файлом DialogFlowService.kt. Спасибо за любую помощь заранее.