簡體   English   中英

改型字符串數組發送對象表示形式而不是請求中的值。

[英]Retrofit string array sending object representation instead of value in request.

我在Android項目中使用帶有Jackson轉換器的Retrofit 2和以下請求:

@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") List<String> array);

這是我傳遞給接口方法的值:

// the array of strings @Field param
ArrayList<String> arrayOfStrings = new ArrayList<>();
arrayOfStrings.add("1.2");
// the id param
int id = 2;

我運行應用程序,讓API調用執行請求,然后通過Charles檢索請求。

這是問題。 請求參數“ array_of_strings”是使用對象引用而不是數組對象的實際值發送的:

// charles request shows:
array_of_strings [I@41fea508
// instead of:
array_of_stings ["1.2"]

如何讓Retrofit / Jackson使用數組對象的值而不是對象引用值?

我想您應該在array_of_strings字段名稱中添加[]括號,這樣Retrofit就會知道您將要發送一個數組並將其正確轉換為數組字段:

@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings[]") List<String> array);

通過使用rom4ek在此答案中的注釋,可以使用ArrayList<String>作為參數類型。 Jackson必須對ArrayLists進行序列化的方式與對數組或List進行序列化的方式不同。

@FormUrlEncoded
@PATCH("foo/{id}")
Call<FooModel> apiCallWithArrayOfStrings(@Path("id") int id, @Field("array_of_strings") ArrayList<String> array);

Android Retrofit 2 - 發送數組時出現問題<object>使用 POST<div id="text_translate"><p> 我是 retrofit 的新手,現在,當我知道如何在沒有任何對象的情況下發送普通數據時,僅使用參數或簡單的主體我想知道如何發送對象......我花了大約 20 小時來調試它,我很困惑因為我不知道該怎么做...有我的代碼:</p><p> API 接口:</p><pre> @POST("/api/assortment") Call<PostAssortment> getAssortment(@Body String PostShipmentProgress);</pre><p> 郵政分類 class:</p><pre> public class PostAssortment { private String JSON; @SerializedName("token") @Expose private String token; @SerializedName("assortment") @Expose private Assortment assortment; @SerializedName("tokens") @Expose private List<String> tokens; @SerializedName("positions") @Expose private List<Position> positions; @SerializedName("deviceId") @Expose private String deviceId; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public Shipment getAssortment() { return assortment; } public void setAssortment(Assortment assortment) { this.assortment = assortment; } public List<String> getTokens() { return tokens; } public void setTokens(List<String> tokens) { this.tokens = tokens; } public List<Position> getPositions() { return positions; } public void setPositions(List<Position> positions) { this.positions = positions; } public String getDeviceId() { return deviceId; } public void setDeviceId(String deviceId) { this.deviceId = deviceId; } public String getJSON() { return JSON; } public void setJSON(String JSON) { this.JSON = JSON; } }</pre><p> 和 mainJava class:</p><pre> Gson gson = new Gson(); PostAssortment postAssortment= new PostAssortment(); List<String> tokens = new ArrayList<>(); tokens.add("someToken"); postAssortment.setTokens(tokens); postAssortment.setDeviceId("aaaaa"); List<Position> currentPosition = new ArrayList<>(); Position cp = new Position(); cp.setItemName("Some"); cp.setPlace("POLAND"); cp.setTimestamp("2020-12-09T11:00:00"); currentPosition.add(cp); postAssortment.setPositions(currentPosition); String postAssortmentJSON = gson.toJson(postAssortment); Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortmentJSON); call.enqueue(new Callback<PostAssortment>() { @Override public void onResponse(Call<PostAssortment> call, Response<PostAssortment> response) { PostAssortment assortmentResponse = response.body(); } @Override public void onFailure(Call<PostAssortment> call, Throwable t) { Log.d("FAILURE", "onFailure: " + t.getMessage()); } }); }</pre><p> 還有我的 retrofit onCreate:</p><pre> Gson gson = new GsonBuilder().setLenient().create(); String BASE_URL = getString(API_URL); Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).build(); ApiLoginInterface = retrofit.create(ApiLoginInterface.class);</pre><p> 在我嘗試調用它之后,我沒有得到任何調用排隊的點</p><pre>Android: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference</pre><p> 錯誤......有人可以描述這個並幫助我讓它工作嗎? :/</p></div></object>

[英]Android Retrofit 2 - problem with sending the Array<Object> using POST

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 使用Retrofit在POST請求中發送數組列表會向對象發送內存地址,而不是發送值 SOAP請求。 將字符串轉換為字節數組 改造:使用 JSON 數組發送 POST 請求 Android 廣告請求。 字符串數組中的關鍵字 在Android中進行改裝-使用對象而不是json中的數組 改造:發送POST請求 發送類型為Object而不是String的對象-多態 將 Retrofit 字符串值轉換為日期 object Android Retrofit 2 - 發送數組時出現問題<object>使用 POST<div id="text_translate"><p> 我是 retrofit 的新手,現在,當我知道如何在沒有任何對象的情況下發送普通數據時,僅使用參數或簡單的主體我想知道如何發送對象......我花了大約 20 小時來調試它,我很困惑因為我不知道該怎么做...有我的代碼:</p><p> API 接口:</p><pre> @POST("/api/assortment") Call<PostAssortment> getAssortment(@Body String PostShipmentProgress);</pre><p> 郵政分類 class:</p><pre> public class PostAssortment { private String JSON; @SerializedName("token") @Expose private String token; @SerializedName("assortment") @Expose private Assortment assortment; @SerializedName("tokens") @Expose private List<String> tokens; @SerializedName("positions") @Expose private List<Position> positions; @SerializedName("deviceId") @Expose private String deviceId; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public Shipment getAssortment() { return assortment; } public void setAssortment(Assortment assortment) { this.assortment = assortment; } public List<String> getTokens() { return tokens; } public void setTokens(List<String> tokens) { this.tokens = tokens; } public List<Position> getPositions() { return positions; } public void setPositions(List<Position> positions) { this.positions = positions; } public String getDeviceId() { return deviceId; } public void setDeviceId(String deviceId) { this.deviceId = deviceId; } public String getJSON() { return JSON; } public void setJSON(String JSON) { this.JSON = JSON; } }</pre><p> 和 mainJava class:</p><pre> Gson gson = new Gson(); PostAssortment postAssortment= new PostAssortment(); List<String> tokens = new ArrayList<>(); tokens.add("someToken"); postAssortment.setTokens(tokens); postAssortment.setDeviceId("aaaaa"); List<Position> currentPosition = new ArrayList<>(); Position cp = new Position(); cp.setItemName("Some"); cp.setPlace("POLAND"); cp.setTimestamp("2020-12-09T11:00:00"); currentPosition.add(cp); postAssortment.setPositions(currentPosition); String postAssortmentJSON = gson.toJson(postAssortment); Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortmentJSON); call.enqueue(new Callback<PostAssortment>() { @Override public void onResponse(Call<PostAssortment> call, Response<PostAssortment> response) { PostAssortment assortmentResponse = response.body(); } @Override public void onFailure(Call<PostAssortment> call, Throwable t) { Log.d("FAILURE", "onFailure: " + t.getMessage()); } }); }</pre><p> 還有我的 retrofit onCreate:</p><pre> Gson gson = new GsonBuilder().setLenient().create(); String BASE_URL = getString(API_URL); Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create(gson)).build(); ApiLoginInterface = retrofit.create(ApiLoginInterface.class);</pre><p> 在我嘗試調用它之后,我沒有得到任何調用排隊的點</p><pre>Android: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference</pre><p> 錯誤......有人可以描述這個並幫助我讓它工作嗎? :/</p></div></object> 改裝GET請求中的字符串
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM