如何使用改造 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://github.com/codemaker2015/AR-Toy/blob/master/app/src/main/java/com/tcs/artoy/activity/LoginActivity.java
- https://github.com/codemaker2015/vauthenticate
更多:
https://howtoprogram.xyz/2017/02/17/how-to-post-with-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://github.com/codemaker2015/AR-Toy/blob/master/app/src/main/java/com/tcs/artoy/activity/LoginActivity.java
- https://github.com/codemaker2015/vauthenticate
更多:
https://howtoprogram.xyz/2017/02/17/how-to-post-with-retrofit-2/