响应代码为 400 的错误请求,使用 okHttp 4.*
Bad request with response code 400, when posting json data to rest api using okHttp 4.*
目标 :我正在使用 sharepoint REST APIs 在我的 sharepoint 站点中创建一个 list。在这种情况下,我使用 okHttp 作为我的 Http 库。
预期结果 : 使用 okHttp 调用请求时应 return 201 作为响应代码。
实际结果:
Exception in thread "main" java.io.IOException: unexpected code Response{protocol=http/1.1, code=400, message=Bad Request, url=https://***.sharepoint.com/_api/web/lists}
at com.**.list.ListImpl.createAList(ListImpl.java:39)
at com.**.Test.main(Test.java:16)
以下是我实施的步骤:
- 创建不记名令牌
- 在请求中设置需要的headers
- 创建一个 object 我要发送的类型
- 将 object 序列化为 json,这样数据将作为 json 数据发送。
我已经用邮递员测试了API。效果很好,得到了想要的结果。
我调试了代码,预期值也成功分配给了各个变量。
我知道 400 错误请求意味着 JSON 数据有问题并且服务器无法解析我发送的 json。
尽管我试过了,但找不到解决这个问题的方法。
任何帮助将不胜感激。
以下是代码示例。
ListImple.java
package com.****.list;
import com.**.app.properties.ApplicationProperties;
import com.**.metadata.MetaData;
import com.**.rest.TokenService;
import okhttp3.*;
import org.json.JSONObject;
import java.io.IOException;
public class ListImpl implements List {
private String api ="/lists";
private MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private final OkHttpClient client = new OkHttpClient();
@Override
public void createAList(String token) throws IOException {
MetaData metaData = new MetaData("SP.List");
ListModel listData = new ListModel(metaData,true,104,
true,"sample description 02", "list-number-02");
JSONObject jsonObject = new JSONObject(listData);
String data = jsonObject.toString();
RequestBody formBody = RequestBody.create(data, JSON);
System.out.println(formBody.contentType());
Request request = new Request.Builder()
.url(ApplicationProperties.getBaseUrl() + api)
.addHeader("Authorization", "Bearer " + token)
.addHeader("Content-Type", "application/json;odata=verbose")
.addHeader("accept", "application/json;odata=verbose")
.addHeader("X-RequestDigest", "0x87D8893C3016E8E7EB288E13276DE7C8D5250EC26025FDADCF9A3E6C86DF0C4A5EC86B3B4AEAD882E06058BC0919A61E10C3DEFDE3B275E67698A9E1B4456CEF")
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if(!response.isSuccessful()) {
throw new IOException("unexpected code " + response);
}
System.out.println(response.body().string());
}
}
}
经过几天的调试,我得出结论,问题出在 OkHttp rest 库上。
所以我删除了那个库并将 org.apache.httpcomponents
工件包含在 pom.xml 文件中。
现在一切正常。
目标 :我正在使用 sharepoint REST APIs 在我的 sharepoint 站点中创建一个 list。在这种情况下,我使用 okHttp 作为我的 Http 库。
预期结果 : 使用 okHttp 调用请求时应 return 201 作为响应代码。
实际结果:
Exception in thread "main" java.io.IOException: unexpected code Response{protocol=http/1.1, code=400, message=Bad Request, url=https://***.sharepoint.com/_api/web/lists}
at com.**.list.ListImpl.createAList(ListImpl.java:39)
at com.**.Test.main(Test.java:16)
以下是我实施的步骤:
- 创建不记名令牌
- 在请求中设置需要的headers
- 创建一个 object 我要发送的类型
- 将 object 序列化为 json,这样数据将作为 json 数据发送。
我已经用邮递员测试了API。效果很好,得到了想要的结果。
我调试了代码,预期值也成功分配给了各个变量。
我知道 400 错误请求意味着 JSON 数据有问题并且服务器无法解析我发送的 json。 尽管我试过了,但找不到解决这个问题的方法。 任何帮助将不胜感激。
以下是代码示例。
ListImple.java
package com.****.list;
import com.**.app.properties.ApplicationProperties;
import com.**.metadata.MetaData;
import com.**.rest.TokenService;
import okhttp3.*;
import org.json.JSONObject;
import java.io.IOException;
public class ListImpl implements List {
private String api ="/lists";
private MediaType JSON = MediaType.parse("application/json; charset=utf-8");
private final OkHttpClient client = new OkHttpClient();
@Override
public void createAList(String token) throws IOException {
MetaData metaData = new MetaData("SP.List");
ListModel listData = new ListModel(metaData,true,104,
true,"sample description 02", "list-number-02");
JSONObject jsonObject = new JSONObject(listData);
String data = jsonObject.toString();
RequestBody formBody = RequestBody.create(data, JSON);
System.out.println(formBody.contentType());
Request request = new Request.Builder()
.url(ApplicationProperties.getBaseUrl() + api)
.addHeader("Authorization", "Bearer " + token)
.addHeader("Content-Type", "application/json;odata=verbose")
.addHeader("accept", "application/json;odata=verbose")
.addHeader("X-RequestDigest", "0x87D8893C3016E8E7EB288E13276DE7C8D5250EC26025FDADCF9A3E6C86DF0C4A5EC86B3B4AEAD882E06058BC0919A61E10C3DEFDE3B275E67698A9E1B4456CEF")
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if(!response.isSuccessful()) {
throw new IOException("unexpected code " + response);
}
System.out.println(response.body().string());
}
}
}
经过几天的调试,我得出结论,问题出在 OkHttp rest 库上。
所以我删除了那个库并将 org.apache.httpcomponents
工件包含在 pom.xml 文件中。
现在一切正常。