android - 使用 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)
我会感谢任何帮助。
解决方案
好吧,servermaster 允许通过 header ant 发送令牌,它有点解决了这个问题,但在 android 中它永远不会工作。谢谢大家。