java.io.IOException 从错误响应中获取数据时
java.io.IOException when getting data from error response
我实现了一个简单的POST登录请求API。
val fuelRequest = Fuel.post(urlString)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.jsonBody(UtilsString.getStringForDictionary(params))
fuelRequest.response() { _, response, result ->
...
callback.onComplete(result)
}
当响应ok的时候,就没有问题了。当我尝试从错误请求中获取数据响应时出现问题。我得到的数据是这样的:
{
"code": 401,
"error": "The specified credentials are invalid."
}
这带有 401 未经授权的响应。我只是想从请求中获取消息。如果我尝试 response.data
它抛出 方法抛出 'java.io.IOException 如果我尝试 result.component()2.response
它抛出 方法抛出 'android.os.NetworkOnMainThreadException'例外。无法评估 com.github.kittinunf.fuel.core.Response.toString() 如果我尝试 result.error.errorData
它会抛出 Method throwed 'java.io.IOException
知道如何获得回复吗?
您可以获得这样的响应,并根据响应做任何您想做的事情。
Fuel.post("https://api.chui.ai/v1/enroll")
.header(headers)
.body(json.toString(), Charset.forName("UTF-8"))
.responseString(new com.github.kittinunf.fuel.core.Handler<String>() {
@Override
public void failure(@NotNull com.github.kittinunf.fuel.core.Request request,
@NotNull com.github.kittinunf.fuel.core.Response response,
@NotNull FuelError error) {
Log.d("Fuel.failure", error.getMessage());
}
@Override
public void success(@NotNull com.github.kittinunf.fuel.core.Request request,
@NotNull com.github.kittinunf.fuel.core.Response response,
String data) {
// data is a string, parse as using you fav json library
Log.d("Fuel.success", data);
}
我复制了你的代码,如果我添加这个:
findViewById<FloatingActionButton>(R.id.fab).setOnClickListener { view ->
val fuelRequest = Fuel.post("http://10.0.2.2:3000/")
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.jsonBody(UtilsString.getStringForDictionary(params))
fuelRequest.response() { _, response, _ ->
println(String(response.data))
}
}
我可以看到错误响应的正文。
端点 10.0.2.2:3000 是一个小型 express.js 应用程序,它只提供一个小型 json.
app.post('/', function (req, res) {
res.status(401).jsonp({ error: 'failed' })
});
我无法在评论中添加代码片段,但这是代码片段。你可以像这样接受请求,并根据你的用例做任何你想做的事。
import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.fuel.core.FuelError
import com.github.kittinunf.result.Result
private class ResponseError(
val statusCode: Int,
val statusMessage: String,
val errorMessage: String
) : RuntimeException("[%d - %s] %s".format(statusCode, statusMessage, errorMessage))
fun main(args: Array<String>) {
val (request, response, result) = Fuel.post("http://httpbin.org/post").responseString()
when (result) {
is Result.Failure -> onError(result)
}
print("done")
}
/**
*
*/
fun onError(failureResult: Result.Failure<String, FuelError>) {
throw ResponseError(
statusCode = failureResult.error.response.statusCode,
statusMessage = failureResult.error.response.responseMessage,
errorMessage = failureResult.getErrorMessage())
}
/**
*
*/
private fun Result.Failure<String, FuelError>.getErrorMessage(): String {
return try {
val string = String(this.error.errorData)
print(string)
string
} catch (e: RuntimeException) {
""
}
}
我实现了一个简单的POST登录请求API。
val fuelRequest = Fuel.post(urlString)
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.jsonBody(UtilsString.getStringForDictionary(params))
fuelRequest.response() { _, response, result ->
...
callback.onComplete(result)
}
当响应ok的时候,就没有问题了。当我尝试从错误请求中获取数据响应时出现问题。我得到的数据是这样的:
{
"code": 401,
"error": "The specified credentials are invalid."
}
这带有 401 未经授权的响应。我只是想从请求中获取消息。如果我尝试 response.data
它抛出 方法抛出 'java.io.IOException 如果我尝试 result.component()2.response
它抛出 方法抛出 'android.os.NetworkOnMainThreadException'例外。无法评估 com.github.kittinunf.fuel.core.Response.toString() 如果我尝试 result.error.errorData
它会抛出 Method throwed 'java.io.IOException
知道如何获得回复吗?
您可以获得这样的响应,并根据响应做任何您想做的事情。
Fuel.post("https://api.chui.ai/v1/enroll")
.header(headers)
.body(json.toString(), Charset.forName("UTF-8"))
.responseString(new com.github.kittinunf.fuel.core.Handler<String>() {
@Override
public void failure(@NotNull com.github.kittinunf.fuel.core.Request request,
@NotNull com.github.kittinunf.fuel.core.Response response,
@NotNull FuelError error) {
Log.d("Fuel.failure", error.getMessage());
}
@Override
public void success(@NotNull com.github.kittinunf.fuel.core.Request request,
@NotNull com.github.kittinunf.fuel.core.Response response,
String data) {
// data is a string, parse as using you fav json library
Log.d("Fuel.success", data);
}
我复制了你的代码,如果我添加这个:
findViewById<FloatingActionButton>(R.id.fab).setOnClickListener { view ->
val fuelRequest = Fuel.post("http://10.0.2.2:3000/")
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.jsonBody(UtilsString.getStringForDictionary(params))
fuelRequest.response() { _, response, _ ->
println(String(response.data))
}
}
我可以看到错误响应的正文。 端点 10.0.2.2:3000 是一个小型 express.js 应用程序,它只提供一个小型 json.
app.post('/', function (req, res) {
res.status(401).jsonp({ error: 'failed' })
});
我无法在评论中添加代码片段,但这是代码片段。你可以像这样接受请求,并根据你的用例做任何你想做的事。
import com.github.kittinunf.fuel.Fuel
import com.github.kittinunf.fuel.core.FuelError
import com.github.kittinunf.result.Result
private class ResponseError(
val statusCode: Int,
val statusMessage: String,
val errorMessage: String
) : RuntimeException("[%d - %s] %s".format(statusCode, statusMessage, errorMessage))
fun main(args: Array<String>) {
val (request, response, result) = Fuel.post("http://httpbin.org/post").responseString()
when (result) {
is Result.Failure -> onError(result)
}
print("done")
}
/**
*
*/
fun onError(failureResult: Result.Failure<String, FuelError>) {
throw ResponseError(
statusCode = failureResult.error.response.statusCode,
statusMessage = failureResult.error.response.responseMessage,
errorMessage = failureResult.getErrorMessage())
}
/**
*
*/
private fun Result.Failure<String, FuelError>.getErrorMessage(): String {
return try {
val string = String(this.error.errorData)
print(string)
string
} catch (e: RuntimeException) {
""
}
}