###やりたいこと
お世話になります。Androidアプリ内でファイルを解析してくれるWEBサービスを利用したいです。
それにはapikeyと解析対象のファイルをサービスへPOSTする必要がありますので、その処理を実装したのですが、「apikeyの値がnullか空」という旨のエラーコードを返されてしまいます。これを解決したいです。
###APIの仕様書
こちらになります。今回はAPI version V2を利用するものとします。
###コードと問題点
retrofit2とOKhttpを使用しています。
まずはInterfaceから
Kotlin
1#Myservice.kt 2 3import okhttp3.RequestBody 4import okhttp3.ResponseBody 5import retrofit2.Call 6import retrofit2.http.* 7import okhttp3.MultipartBody 8import retrofit2.Response 9import retrofit2.http.POST 10 11interface MyService{ 12 @Multipart 13 @POST("v2/analyzeWav") 14 fun postRawRequestForPosts( 15 @Part file: MultipartBody.Part, 16 @Part("testpart") requestBody : RequestBody 17 ):Call<ResponseBody> 18}
こちらはMainactivity.ktです。
Kotlin
1#MainActivity.kt 2 3package jp.co.casareal.retrofitbasic 4 5import android.os.Bundle 6import android.util.Log 7import android.view.View 8import android.widget.Toast 9import androidx.appcompat.app.AppCompatActivity 10import androidx.databinding.DataBindingUtil 11import androidx.lifecycle.ViewModelProvider 12import jp.co.casareal.retrofitbasic.databinding.ActivityMainBinding 13import jp.co.casareal.retrofitbasic.util.Util 14import kotlinx.coroutines.CoroutineScope 15import kotlinx.coroutines.Dispatchers 16import kotlinx.coroutines.launch 17import okhttp3.MediaType 18import okhttp3.MultipartBody 19import okhttp3.RequestBody 20import retrofit2.Retrofit 21import java.io.File 22 23class MainActivity : AppCompatActivity() { 24 25 // Retrofit本体 26 private val retrofit = Retrofit.Builder().apply { 27 baseUrl(" https://api.webempath.net/") 28 }.build() 29 30 // サービスクラスの実装オブジェクト取得 31 private val service = retrofit.create(MyService::class.java) 32 33 private val myViewModel: MyViewModel by lazy { 34 ViewModelProvider.NewInstanceFactory().create(MyViewModel::class.java) 35 } 36 37 private val scope = CoroutineScope(Dispatchers.IO) 38 39 override fun onCreate(savedInstanceState: Bundle?) { 40 super.onCreate(savedInstanceState) 41 val binding = 42 DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main) 43 44 binding.model = myViewModel 45 binding.lifecycleOwner = this 46 } 47 48 /** POSTボタンが押された時の処理*/ 49 fun onPostButtonClick(view: View) { 50 51 if (!myViewModel.author.value.isNullOrBlank() && !myViewModel.title.value.isNullOrBlank()) { 52 53 //apikey送信設定 54 val strContent = "{ 'apikey' : '自分のAPIキー'}" 55 val mediaTypebody = MediaType.parse("application/json") 56 val reqBodybody = RequestBody.create(mediaTypebody, strContent) 57 58 //wavファイル送信設定 59 val filepath = "解析対象のファイルのパス" 60 val audioFile = File(filepath) 61 val mediaTypefile = MediaType.parse("audio/*") 62 val reqBodyfile = RequestBody.create(mediaTypefile, audioFile) 63 val part = MultipartBody.Part.createFormData("part_name", audioFile.name, reqBodyfile) 64 65 val post = service.postRawRequestForPosts(part,reqBodybody) 66 67 scope.launch { 68 val responseBody = post.execute() 69 responseBody.body()?.let { 70 myViewModel.result.postValue(it.string()) 71 } 72 } 73 } 74 } 75 76
※画面上にresponseを表示するという処理をさせているだけなのでレイアウトとviewmodelは省略します。
このコードを実行すると、{"error":1001,"msg":"apikey is null or empty"}と返されます。
curlで同じapikeyを送信すると1001エラーが出てこなかったためapikey自身には問題がなさそうで、
エラーコードからAPI仕様書を見ても同じような旨なのでapikeyがうまく送信されていないと思っています。
###知りたいこと、わからないこと
apikeyはMediaType.parse("application/json")でPOSTしていますが、こちらがいけないのでしょうか?
下記に並べている参考文献を含めPOSTで文字列を送る際はjsonで送るケースばかりで特別問題があるように思えませんが、エラー的にapikeyの送信に問題がありそうなので怪しいのかなと思っています。
よろしくおねがいします。
###追記
そもそもjson形式で送ってはいけないのでは?という指摘を頂いたので念の為仕様書にあったサンプルコードを追記します。(同時並行でmultipartでの文字列の取り扱いについても調べてまいります)
###参考にした文献
Let's はじめてのRetrofit for Android in Kotlin(サンプルコード付き)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/10/28 08:46
2021/10/28 08:59
退会済みユーザー
2021/10/28 09:17