首页 > 解决方案 > 使用 Okhttp 将字符串转换为 json

问题描述

首先,我一直在寻找答案,但实际上都没有,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 需要附加令牌时会出现问题,例如: 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)

我会感谢任何帮助。

标签: androidapiurlposttoken

解决方案


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


推荐阅读