【问题标题】:Converting string to json with Okhttp使用 Okhttp 将字符串转换为 json
【发布时间】:2018-11-12 18:18:17
【问题描述】:

首先,我一直在寻找答案,但实际上都没有,API没问题,url也没问题。

我有一个构建 url 和 API 名称的方法构建器,它工作正常,但是其中一个 API 将令牌附加到 url 中,并通过 post 附加参数,我有麻烦

我正在使用的发布方法

public Heap post(String... params) throws ApiException {
    Heap answer = new Heap();
    StringBuilder listedParams = new StringBuilder();
    for (int i = 1; i < params.length - 1; i++) {
        listedParams.append(params[i]);
    }
    try {
        answer = new Heap(new JSONObject(new AsyncRequest().execute(urlBuildier(params[0]), listedParams.toString(), "post").get()));
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return answer;
}

我正在使用的 urlBuilder 方法

private String urlBuildier(String... parts) {
    ArrayList<String> params = new ArrayList<>();
    if (assets)
        params.add(urlAssets);
    else
        params.add(url);

    final StringBuilder helper = new StringBuilder();
    Collections.addAll(params, parts);
    Heap built = new Heap(params);
    built.forEach(new Part() {
        @Override
        public void Run(Heap part) {
            helper.append(part.get());
        }
    });
    return helper.toString();
}

异步类

OkHttpClient client = new OkHttpClient();
                MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
                RequestBody body = RequestBody.create(mediaType, params[1]);
                Request request = new Request.Builder()
                        .post(body)
                        .addHeader("content-type", "application/x-www-form-urlencoded")
                        .url(params[0])
                        .build();

                Response response = client.newCall(request).execute();

                String responseStrng = response.body().string();
                return responseStrng;

url需要附加token时出现问题,例如: https://url/api/apiname?这适用于我的 post 方法

但是:https://url/api/apiname?token=abc123 不适用于我的 post 方法。

PDT:我从以前的工作方法中改变的唯一一点是我的帖子和帖子异步:

以前的帖子方法

public Heap post(String... params) throws ApiException {
    Heap answer = new Heap();
    try {
        answer = new Heap(new JSONObject(new AsyncRequest().execute(urlBuildier(params), "post").get()));
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return answer;
}

以前的 okhttp 异步

final String[] post = params[0].split("[?]");
                OkHttpClient client = new OkHttpClient();

                MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
                RequestBody body = RequestBody.create(mediaType, post[1]);
                Request request = new Request.Builder()
                        .url(post[0])
                        .post(body)
                        .addHeader("content-type", "application/x-www-form-urlencoded")
                        .build();

                Response response = client.newCall(request).execute();
                String responseStrng = response.body().string();
return responseStrng;

这是我的日志:

06-02 22:32:04.443 6335-6335/co.cardseed.cardseed W/System.err:   org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be   converted to JSONObject
    at org.json.JSON.typeMismatch(JSON.java:111)
    at org.json.JSONObject.<init>(JSONObject.java:160)
    at org.json.JSONObject.<init>(JSONObject.java:173)
06-02 22:32:04.444 6335-6335/co.cardseed.cardseed W/System.err:     at co.cardseed.cardseed.app.api.Api.post(Api.java:103)
    at co.cardseed.cardseed.activities.WebActivity.onCreate(WebActivity.java:45)
    at android.app.Activity.performCreate(Activity.java:6272)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
    at android.app.ActivityThread.access$900(ActivityThread.java:157)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1356)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5551)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

我会感谢任何帮助。

【问题讨论】:

  • 能否请您添加您尝试解析的字符串的字符串值?看来问题出在这个地方
  • 更新。当我将长令牌添加到 url 时,会触发问题,但使用以下内容:token=123,API 以通常的 json 响应。
  • “Api.java:103”到底是哪一行?
  • answer = new Heap(new JSONObject(new AsyncRequest().execute(urlBuildier(params[0]),listedParams.toString(), "post").get()));那一个,我尝试将异步请求响应转换为 JSONObject

标签: android api url post token


【解决方案1】:

好吧,servermaster 允许通过 header ant 发送令牌,它有点解决了问题,但在 android 中它永远无法工作。谢谢大家。

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多