【问题标题】:Bad request with response code 400, when posting json data to rest api using okHttp 4.*使用 okHttp 4.* 将 json 数据发布到 rest api 时,响应代码为 400 的错误请求
【发布时间】:2020-04-15 17:47:12
【问题描述】:

目标:我正在使用 sharepoint REST API 在我的 sharepoint 站点中创建 list。在这种情况下,我使用 okHttp 作为我的 Http 库。

预期结果:使用 okHttp 调用请求时应返回 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)

以下是我实施的步骤:

  1. 创建不记名令牌
  2. 在请求中设置所需的标头
  3. 创建一个我想要发送的对象
  4. 将对象序列化为json,这样数据就会作为json数据发送。

我已经使用邮递员来测试 API。效果很好,得到了想要的结果。

我已调试代码,预期值也已成功分配给相应的变量。

我知道 400 bad request 意味着 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());
        }
    }

}

【问题讨论】:

  • 我遇到过这种错误,它给出 400。我觉得其中大多数是由于没有设置正确的内容类型或接受标题。请确认您是否需要更改:Content-Type", "application/json;odata=verbose").addHeader("accept", "application/json;odata=verbose")
  • @SantosshKumhar 我已经从上述两个标头中省略了两个 odata=verbose 部分,但仍然给我同样的错误请求错误。

标签: java okhttp sharepoint-online


【解决方案1】:

经过几天的调试,我得出的结论是,问题出在 OkHttp 休息库。 所以我删除了那个库并在 pom.xml 文件中包含了org.apache.httpcomponents 工件。 现在一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多