如何使用改造 2 发出 POST 请求?

How to make a POST request using retrofit 2?

我只能从文档中 运行 hello world 示例 (GithubService)。

问题是当我 运行 我的代码时,我在 onFailure()

中得到以下错误

Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

我的 API 采用 POST 参数值,因此无需将它们编码为 JSON,但它确实 return JSON 中的响应。

对于响应,我得到了我使用工具生成的 ApiResponse class。

我的界面:

public interface ApiService {
    @POST("/")
    Call<ApiResponse> request(@Body HashMap<String, String> parameters);
}

以下是我使用该服务的方式:

HashMap<String, String> parameters = new HashMap<>();
parameters.put("api_key", "xxxxxxxxx");
parameters.put("app_id", "xxxxxxxxxxx");

Call<ApiResponse> call = client.request(parameters);
call.enqueue(new Callback<ApiResponse>() {
    @Override
    public void onResponse(Response<ApiResponse> response) {
        Log.d(LOG_TAG, "message = " + response.message());
        if(response.isSuccess()){
            Log.d(LOG_TAG, "-----isSuccess----");
        }else{
            Log.d(LOG_TAG, "-----isFalse-----");
        }

    }
    @Override
    public void onFailure(Throwable t) {
        Log.d(LOG_TAG, "----onFailure------");
        Log.e(LOG_TAG, t.getMessage());
        Log.d(LOG_TAG, "----onFailure------");
    }
});

您应该知道要如何对 post 参数进行编码。下面的 @Header 注释也很重要。它用于定义在 HTTP header.

中使用的内容类型
@Headers("Content-type: application/json")
@POST("user/savetext")
    public Call<Id> changeShortText(@Body MyObjectToSend text);

您必须以某种方式对 post 参数进行编码。要使用 JSON 进行传输,您应该将 .addConverterFactory(GsonConverterFactory.create(gson)) 添加到 Retrofit 声明中。

Retrofit restAdapter = new Retrofit.Builder()
                .baseUrl(RestConstants.BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient)
                .build();

您的问题的另一个来源可能是来自其余后端的 JSON 似乎不正确。您应该使用验证器检查 json 语法,例如http://jsonlint.com/.

如果您不想使用 JSON 编码的参数,请使用:

@FormUrlEncoded
@POST("/")
Call<ApiResponse> request(@Field("api_key") String apiKey, @Field("app_id") String appId);

假设我们有一个 JSON 字符串,我们想使用 Retrofit 2 来 post 字符串到远程 API:

{ "name": "Introduction to Unity3D", "author": "Vishnu Sivan" }

到post一个JSON字符串用Retrofit 2,我们可以定义一个POJO来表示我们需要的JSON。例如,一个代表JSON的POJO可以这样定义:

public class Book {
 
  private Long id;
  private String name;
  private String author;
 
  // constructor
  // getter and setter
}

然后我们可以定义端点如下:

public interface GetDataService {

    @POST("post")
    Call<Book> addBook(@Body Book book);
}

因为我们用@Body注解给参数注解,Retrofit 2会使用转换器库将参数序列化为JSON.

接下来,让 post 的 JSON 字符串像我们 post 一个带有 Retrofit 2 的对象:

public void testPostJson() throws IOException {

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://httpbin.org/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

    GetDataService service = retrofit.create(GetDataService.class);
    Book book = new Book(1, "Introduction to Unity3D", "Vishnu Sivan");

    call.enqueue(new Callback<Book>() {
        @Override
        public void onResponse(Call<Book> call, Response<Book> response) {
            Book book = response.body();
            Log.d("book", book.getName()); //getName() is the getter method that declared in the Book model class
        }

        @Override
        public void onFailure(Call<com.tcs.artoy.model.Response> call, Throwable t) {
            Log.e("error", t.toString());
        }
    });
}

注意:这里我们得到的响应与我们发送到服务器的json格式数据相同。如果您想要与同一请求对象不同的响应,请在您的项目中创建另一个模型文件并将其作为响应类型提及。

如果您想要一个 POST 请求示例,只需检查以下 Github 存储库:

更多:

https://howtoprogram.xyz/2017/02/17/how-to-post-with-retrofit-2/