Retrofit2 POST 方法获取代码 400 但适用于 Restlet Client
Retrofit2 POST method gets code 400 but works with Restlet Client
我正在使用 Retrofit2。我想从我的移动设备 POST 一些数据到我的 Web 服务,但总是收到代码 400 响应。当我尝试从 Restlet Client 发送 POST 请求时,我得到正常响应 (chrome-extension://aejoelaoggembcahagimdiliamlcdmfm/restlet_client.html#requests).
我得到一些信息表明问题可能出在服务器证书中,因此我实现了 OkHttpClient,但我仍然得到相同的结果。
如果我尝试 POST 到 jsonPlaceHolder,我会得到正常结果 (https://jsonplaceholder.typicode.com/posts)
API 界面:
public interface JsonPlaceHolderApi {
@POST("hws/hibisWsTemplate/api/v1/order/posts")
Call<Post> createPost(@Body Post post);
}
我的 POST CLASS:
public class Post {
private String vodilni_slog;
private String IBAN_placnka;
private String polog;
...
public Post(String vodilni_slog, String IBAN_placnka, String polog) {
this.vodilni_slog = vodilni_slog;
this.IBAN_placnka = IBAN_placnka;
this.polog = polog;
...
}
//getters and setters
...
}
MAIN ACTIVITY(只有我发送 POST 请求的部分):
...
send_btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//RETROFIT
OkHttpClient okHttpClient = getUnsafeOkHttpClient();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://xxxxxx.x-xx.xx/") //url
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
Post post = new Post("test", "test", "test", "test");
Call<Post> call = jsonPlaceHolderApi.createPost(post);
call.enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
if (!response.isSuccessful()) {
MainActivity.content.setText("Code: " + response.code());
return;
}
Post postResponse = response.body();
String x = "";
x += "Code: " + response.code() + "\n";
x += "Naziv: " + postResponse.getIme_prejemnika() + "\n";
x += "IBAN: " + postResponse.getIBAN_prejemnika() + "\n";
x += "Sklic: " + postResponse.getReferenca_prejemnika() + "\n";
MainActivity.content.setText(x);
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
MainActivity.content.setText(t.getMessage());
}
});
}
});
OKHTTP 客户端:
private static OkHttpClient getUnsafeOkHttpClient() {
try {
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
我希望代码 201 正文:
{
"vodilni_slog": "string",
"polog": "string",
"dvig": "string",
...
{
但我收到代码 400...
我发现我一直收到错误 400,因为 IBAN_placnka 应该是 iban_placnka 所以如果您收到错误 400,请检查您的拼写并使用此行查看您的实际情况进入 json 格式:
Log.e("x" , "Request is" + new Gson().toJson(post).toString() );
我正在使用 Retrofit2。我想从我的移动设备 POST 一些数据到我的 Web 服务,但总是收到代码 400 响应。当我尝试从 Restlet Client 发送 POST 请求时,我得到正常响应 (chrome-extension://aejoelaoggembcahagimdiliamlcdmfm/restlet_client.html#requests).
我得到一些信息表明问题可能出在服务器证书中,因此我实现了 OkHttpClient,但我仍然得到相同的结果。 如果我尝试 POST 到 jsonPlaceHolder,我会得到正常结果 (https://jsonplaceholder.typicode.com/posts)
API 界面:
public interface JsonPlaceHolderApi {
@POST("hws/hibisWsTemplate/api/v1/order/posts")
Call<Post> createPost(@Body Post post);
}
我的 POST CLASS:
public class Post {
private String vodilni_slog;
private String IBAN_placnka;
private String polog;
...
public Post(String vodilni_slog, String IBAN_placnka, String polog) {
this.vodilni_slog = vodilni_slog;
this.IBAN_placnka = IBAN_placnka;
this.polog = polog;
...
}
//getters and setters
...
}
MAIN ACTIVITY(只有我发送 POST 请求的部分):
...
send_btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//RETROFIT
OkHttpClient okHttpClient = getUnsafeOkHttpClient();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://xxxxxx.x-xx.xx/") //url
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
Post post = new Post("test", "test", "test", "test");
Call<Post> call = jsonPlaceHolderApi.createPost(post);
call.enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
if (!response.isSuccessful()) {
MainActivity.content.setText("Code: " + response.code());
return;
}
Post postResponse = response.body();
String x = "";
x += "Code: " + response.code() + "\n";
x += "Naziv: " + postResponse.getIme_prejemnika() + "\n";
x += "IBAN: " + postResponse.getIBAN_prejemnika() + "\n";
x += "Sklic: " + postResponse.getReferenca_prejemnika() + "\n";
MainActivity.content.setText(x);
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
MainActivity.content.setText(t.getMessage());
}
});
}
});
OKHTTP 客户端:
private static OkHttpClient getUnsafeOkHttpClient() {
try {
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
我希望代码 201 正文: { "vodilni_slog": "string", "polog": "string", "dvig": "string", ... {
但我收到代码 400...
我发现我一直收到错误 400,因为 IBAN_placnka 应该是 iban_placnka 所以如果您收到错误 400,请检查您的拼写并使用此行查看您的实际情况进入 json 格式:
Log.e("x" , "Request is" + new Gson().toJson(post).toString() );