在使用 Android 中的 Retrofit 调用实时货币转换 API 时出现错误。

huangapple go评论101阅读模式
英文:

Getting error while using live currency conversion API by Retrofit in Android

问题

以下是翻译好的部分:

  1. // 这是我的 MainActivity.java
  2. public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  3. private static final String TAG = "MainActivity";
  4. private TextView result;
  5. private EditText currency;
  6. private Button button;
  7. private static String BASE_URL = "https://api.currencyscoop.com/v1/";
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. Log.d(TAG, "onCreate: 被调用");
  13. initViews();
  14. button.setOnClickListener(this);
  15. }
  16. public void initViews(){
  17. Log.d(TAG, "initViews: 被调用");
  18. result = findViewById(R.id.result);
  19. currency = findViewById(R.id.amount);
  20. button = findViewById(R.id.button);
  21. }
  22. @Override
  23. public void onClick(View v) {
  24. Log.d(TAG, "onClick: 被调用");
  25. Retrofit retrofit = new Retrofit.Builder()
  26. .baseUrl(BASE_URL)
  27. .addConverterFactory(GsonConverterFactory.create())
  28. .build();
  29. RetrofitClient retrofitClient = retrofit.create(RetrofitClient.class);
  30. Call<ConvertAmt> calling = retrofitClient.getConvertedValue("my_api_key","USD", "INR", currency.getText().toString());
  31. calling.enqueue(new Callback<ConvertAmt>() {
  32. @Override
  33. public void onResponse(Call<ConvertAmt> call, Response<ConvertAmt> response) {
  34. Log.d(TAG, "onResponse: 被调用 :----------------------> "+response.body().getResult());
  35. }
  36. @Override
  37. public void onFailure(Call<ConvertAmt> call, Throwable t) {
  38. Log.d(TAG, "onFailure: --------------> "+t.getStackTrace());
  39. }
  40. });
  41. }
  42. }
  43. // 这是我的 RetrofitClient 接口
  44. public interface RetrofitClient {
  45. @GET("/convert?")
  46. Call<ConvertAmt> getConvertedValue(@Query("api_key") String api_key, @Query("base") String base, @Query("to") String to, @Query("amount") String amount);
  47. }
  48. // 这是我的 ConvertAmt 类(存储结果的模型类)
  49. public class ConvertAmt {
  50. private double result;
  51. public ConvertAmt(double result) {
  52. this.result = result;
  53. }
  54. public double getResult() {
  55. return result;
  56. }
  57. public void setResult(double result) {
  58. this.result = result;
  59. }
  60. @Override
  61. public String toString() {
  62. return "ConvertAmt{" +
  63. "result=" + result +
  64. '}';
  65. }
  66. }
  67. // 这是我的 StackTrace
  68. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: java.io.EOFException: 输入结束于第1行第1列路径 $
  69. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1401)
  70. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:549)
  71. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
  72. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:205)
  73. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
  74. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
  75. 2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:223)
  76. 2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:121)
  77. 2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:206)
  78. 2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
  79. 2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
  80. 2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
  81. 2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at java.lang.Thread.run(Thread.java:761)
英文:

// This is my MainActivity.java

  1. ublic class MainActivity extends AppCompatActivity implements View.OnClickListener{
  2. private static final String TAG = &quot;MainActivity&quot;;
  3. private TextView result;
  4. private EditText currency;
  5. private Button button;
  6. private static String BASE_URL = &quot;https://api.currencyscoop.com/v1/&quot;;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. Log.d(TAG, &quot;onCreate: called&quot;);
  12. initViews();
  13. button.setOnClickListener(this);
  14. }
  15. public void initViews(){
  16. Log.d(TAG, &quot;initViews: called&quot;);
  17. result = findViewById(R.id.result);
  18. currency = findViewById(R.id.amount);
  19. button = findViewById(R.id.button);
  20. }
  21. @Override
  22. public void onClick(View v) {
  23. Log.d(TAG, &quot;onClick: called&quot;);
  24. Retrofit retrofit = new Retrofit.Builder()
  25. .baseUrl(BASE_URL)
  26. .addConverterFactory(GsonConverterFactory.create())
  27. .build();
  28. RetrofitClient retrofitClient = retrofit.create(RetrofitClient.class);
  29. Call&lt;ConvertAmt&gt; calling = retrofitClient.getConvertedValue(&quot;my_api_key&quot;,&quot;USD&quot;, &quot;INR&quot;, currency.getText().toString());
  30. calling.enqueue(new Callback&lt;ConvertAmt&gt;() {
  31. @Override
  32. public void onResponse(Call&lt;ConvertAmt&gt; call, Response&lt;ConvertAmt&gt; response) {
  33. Log.d(TAG, &quot;onResponse: called :----------------------&gt; &quot;+response.body().getResult());
  34. }
  35. @Override
  36. public void onFailure(Call&lt;ConvertAmt&gt; call, Throwable t) {
  37. Log.d(TAG, &quot;onFailure: --------------&gt; &quot;+t.getStackTrace());
  38. }
  39. });
  40. }

}

// This is my RetrofitClient interface

  1. public interface RetrofitClient {
  2. @GET(&quot;/convert?&quot;)
  3. Call&lt;ConvertAmt&gt; getConvertedValue(@Query(&quot;api_key&quot;) String api_key, @Query(&quot;base&quot;) String base, @Query(&quot;to&quot;) String to, @Query(&quot;amount&quot;) String amount);

}

// This is my ConvertAmt class (Model class where i am storing the result)

public class ConvertAmt {
private double result;

  1. public ConvertAmt(double result) {
  2. this.result = result;
  3. }
  4. public double getResult() {
  5. return result;
  6. }
  7. public void setResult(double result) {
  8. this.result = result;
  9. }
  10. @Override
  11. public String toString() {
  12. return &quot;ConvertAmt{&quot; +
  13. &quot;result=&quot; + result +
  14. &#39;}&#39;;
  15. }

}

// This is my StackTrace

  1. 2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: java.io.EOFException: End of input at line 1 column 1 path $

2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1401)
2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:549)
2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.stream.JsonReader.peek(JsonReader.java:425)
2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:205)
2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39)
2020-08-27 23:59:53.212 1471-1471/com.example.online_currency W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)
2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:223)
2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:121)
2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:206)
2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
2020-08-27 23:59:53.213 1471-1471/com.example.online_currency W/System.err: at java.lang.Thread.run(Thread.java:761)

答案1

得分: 0

以下是翻译好的内容:

似乎你从响应中期望的数据与你正在映射的 POJO(Plain Old Java Object,普通的 Java 对象)不匹配。这是你期望的样子:

  1. public class ConvertAmt {
  2. private double result;
  3. }

实际的响应是这样的:

  1. {
  2. "meta": {
  3. "code": 200,
  4. "disclaimer": "Usage subject to terms: https://currencyscoop.com/terms"
  5. },
  6. "response": {
  7. "timestamp": 1598589131,
  8. "date": "2020-08-27",
  9. "from": "USD",
  10. "to": "INR",
  11. "amount": "10",
  12. "value": 738.1371942
  13. }
  14. }

因此,你可以将你的 POJO 转换为这样:

  1. public class ConvertAmt {
  2. private Map<String,Object> meta;
  3. private Map<String,Object> response;
  4. }

你可以这样获取响应:

  1. Call<ConvertAmt> calling = retrofitClient.getConvertedValue("my_api_key", "USD", "INR", currency.getText().toString());
  2. calling.getResponse().get("amount");
英文:

It seems the data you are expecting from the response is not matching to the pojo that you are mapping
this is what you are expecting,

  1. public class ConvertAmt {
  2. private double result;
  3. }

actual response is

  1. {
  2. &quot;meta&quot;: {
  3. &quot;code&quot;: 200,
  4. &quot;disclaimer&quot;: &quot;Usage subject to terms: https://currencyscoop.com/terms&quot;
  5. },
  6. &quot;response&quot;: {
  7. &quot;timestamp&quot;: 1598589131,
  8. &quot;date&quot;: &quot;2020-08-27&quot;,
  9. &quot;from&quot;: &quot;USD&quot;,
  10. &quot;to&quot;: &quot;INR&quot;,
  11. &quot;amount&quot;: &quot;10&quot;,
  12. &quot;value&quot;: 738.1371942
  13. }
  14. }

So you can convert your pojo to

  1. public class ConvertAmt {
  2. private Map&lt;String,Object&gt; meta;
  3. private Map&lt;String,Object&gt; response;
  4. }

and you can get the response like this

  1. Call&lt;ConvertAmt&gt; calling = retrofitClient.getConvertedValue(&quot;my_api_key&quot;,&quot;USD&quot;, &quot;INR&quot;, currency.getText().toString());
  2. calling.getResponse().get(&quot;amount&quot;);

huangapple
  • 本文由 发表于 2020年8月28日 02:31:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/63622207.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定