[英]send post request using Retrofit2 with row json data kotlin
am trying to send post request to payment server payex, when i try to send the request using postman it's working fine, but throw the android is not working i get retrofit2.HttpException: HTTP 400 Bad Request as i understand the problem maybe is sending the data as row json我正在尝试向支付服务器 payex 发送发布请求,当我尝试使用 postman 发送请求时它工作正常,但抛出 android 不工作我得到 retrofit2.HttpException: HTTP 400 Bad Request 据我了解问题可能正在发送数据为行 json
this is my code这是我的代码
// ViewModel
val mediaType: MediaType? = "application/json".toMediaTypeOrNull()
val body: RequestBody = RequestBody.create(
mediaType,
" {\n \"amount\": 1000,\n \"currency\": \"MYR\",\n \"collection_id\": \"\",\n \"capture\": true,\n \"customer_name\": \"Dholfaqar\",\n \"email\": \"udalharazi@gmail.com\",\n \"contact_number\": \"0172572068\",\n \"address\": \"eco sky resident\",\n \"postcode\": \"56473\",\n \"city\": \"kuala lumpuer\",\n \"state\": \"kuala lumpuer\",\n \"country\": \"malaysia\",\n \"shipping_name\": \"\",\n \"shipping_email\": \"\",\n \"shipping_contact_number\": \"\",\n \"shipping_address\": \"\",\n \"shipping_postcode\": \"\",\n \"shipping_city\": \"\",\n \"shipping_state\": \"\",\n \"shipping_country\": \"\",\n \"description\": \"testing\",\n \"reference_number\": \"122674\",\n \"payment_type\": \"card\",\n \"show_payment_types\": false,\n \"tokenize\": false,\n \"card_on_file\": \"\",\n \"return_url\": \"\",\n \"callback_url\": \"\",\n \"accept_url\": \"\",\n \"reject_url\": \"\",\n \"nonce\": \"\",\n \"source\": \"androidapp\",\n \"expiry_date\": \"2022-11-25\"\n }\n"
)
Log.d("body info : ","info => "+body.toString())
GlobalScope.async(Dispatchers.IO) {
try {
val retrofit = ServiceBuilder.buildService(AppApis::class.java)
retrofit.PaymentIntents("Bearer eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRyaWFuQG9wZW5rb20uaW8iLCJNZXJjaGFudElkIjoiMTE3MSIsIk1JRCI6IjEwMTc4MDEiLCJjdG9zIjoidHJ1ZSIsInBhcnRuZXJzIjoidHJ1ZSIsImV4cCI6MTY2OTk1NjA1OCwiaXNzIjoicGF5ZXguaW8iLCJhdWQiOiJwYXlleC5pbyJ9.SrhMtRA39OcprOeLXxyCOYk8c8r8jVAFPzrjiob0u9A",
"application/json","application/json",body).enqueue(
object : Callback<ResponseBody> {
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
var res = response.body()?.string()
Log.d("response xxxxx 43","response => "+res.toString())
var resobj = JSONObject(res!!)
}
override fun onFailure(
call: Call<ResponseBody>,
t: Throwable
) {
}
})
}catch (e: Exception) {
Log.d("outletresponse","Exception => "+ e.toString())
}
}
// AppApis
// @FormUrlEncoded
@POST(AppConstants.Get_Payment_Intents)
suspend fun PaymentIntents(
@Header("Authorization") Authorization: String,
@Header("accept") accept: String,
@Header("Content-Type") Content_Type: String,
@Body bodyParameters:
RequestBody,
): Call<ResponseBody>
for the data type for body i try many different ways but non is working, this what i try对于 body 的数据类型,我尝试了很多不同的方法,但都没有用,这就是我尝试的
val request = PaymentRequest()
request.amount = amount.toString()
request.currency = currency
request.collection_id = collection_id
request.capture = capture.toString()
request.customer_name = customer_name
request.email = email
request.contact_number = contact_number
request.address = address
request.postcode = postcode
request.city = city
request.state = state
request.country = country
request.shipping_name = shipping_name
request.shipping_email = shipping_email
request.shipping_contact_number = shipping_contact_number
request.shipping_address = shipping_address
request.shipping_postcode = shipping_postcode
request.shipping_city = shipping_city
request.shipping_state = shipping_state
request.shipping_country = shipping_country
request.description = description
request.reference_number = reference_number
request.payment_type = payment_type
request.show_payment_types = show_payment_types.toString()
request.tokenize = tokenize.toString()
request.card_on_file = card_on_file
request.return_url = return_url
request.callback_url = callback_url
request.accept_url = accept_url
request.reject_url = reject_url
request.nonce = nonce
request.source = source
request.expiry_date = expiry_date
```
``` val params2: MutableMap<String, String> = HashMap() ```
val bodyParameters = JsonObject()
this is the curl in postman which is working fine
curl --location --request POST 'https://sandbox-payexapi.azurewebsites.net/api/v1/PaymentIntents' \
--header 'accept: application/json' \
--header 'Authorization: Bearer eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRyaWFuQG9wZW5rb20uaW8iLCJNZXJjaGFudElkIjoiMTE3MSIsIk1JRCI6IjEwMTc4MDEiLCJjdG9zIjoidHJ1ZSIsInBhcnRuZXJzIjoidHJ1ZSIsImV4cCI6MTY2OTk1NjA1OCwiaXNzIjoicGF5ZXguaW8iLCJhdWQiOiJwYXlleC5pbyJ9.SrhMtRA39OcprOeLXxyCOYk8c8r8jVAFPzrjiob0u9A' \
--header 'Content-Type: application/json' \
--header 'Cookie: ARRAffinity=6a0fcede443e754c9c62fee8eaa769c00469246725bdb526671819e1553ae727; ARRAffinitySameSite=6a0fcede443e754c9c62fee8eaa769c00469246725bdb526671819e1553ae727' \
--data-raw '[
{
"amount": 1000,
"currency": "MYR",
"collection_id": "",
"capture": "true",
"customer_name": "Dholfaqar",
"email": "udalharazi@gmail.com",
"contact_number": "0172572068",
"address": "eco sky resident",
"postcode": "56473",
"city": "kuala lumpuer",
"state": "kuala lumpuer",
"country": "malaysia",
"shipping_name": "",
"shipping_email": "",
"shipping_contact_number": "",
"shipping_address": "",
"shipping_postcode": "",
"shipping_city": "",
"shipping_state": "",
"shipping_country": "",
"description": "testing",
"reference_number": "122674",
"payment_type": "card",
"show_payment_types": false,
"tokenize": false,
"card_on_file": "",
"return_url": "",
"callback_url": "",
"accept_url": "",
"reject_url": "",
"nonce": "",
"source": "androidapp",
"expiry_date": "2022-11-25"
}
]'
you need to add SerializedName annotation for keys so that when we use Retrofit it generates proper json with those keys.您需要为键添加 SerializedName 注释,以便当我们使用 Retrofit 时,它会使用这些键生成正确的 json。 Using SerializedName we can map our property to jason key.
使用 SerializedName 我们可以将我们的属性 map 转换为 jason 键。 Remember it is better to make the properties optional so that even if server does not response with all the keys we still able to create our rich object in client side.
请记住,最好将属性设为可选,这样即使服务器没有响应所有密钥,我们仍然可以在客户端创建丰富的 object。
exmaple:例如:
data class UserInfo (
@SerializedName("user_id") val userId: Int?,
@SerializedName("user_name") val userName: String?,
@SerializedName("user_email") val userEmail: String?,
@SerializedName("user_age") val userAge: String?,
@SerializedName("user_uid") val userUid: String?
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.