我想使用 OkHttpClient 发出请求,如果响应不成功,我想更改 URL

Posted

技术标签:

【中文标题】我想使用 OkHttpClient 发出请求,如果响应不成功,我想更改 URL【英文标题】:I want to make a request using OkHttpClient and I want to change the URL if the response is not successful 【发布时间】:2021-03-23 00:07:03 【问题描述】:

所以我请求 API 调用以通过电话号码搜索记录。如果响应不成功,我想更改 URL 以按名称搜索记录。为了发送请求并获得响应,我们有一个 try catch 子句。我唯一的想法是使用原始 catch 子句中的新 URL 重复请求和响应。如果原始请求捕获异常,任何人都可以告诉我应该如何更改 URL 并发出新请求。这是我请求按电话号码搜索的代码的 sn-p。以及由于请求失败而明显的stackstrace。

OkHttpClient client = new OkHttpClient().newBuilder().build();
String phone = DNC_List[i].getNumber();
Request request = new Request.Builder().url("https://www.zohoapis.com/crm/v2/Leads/search?phone=" + phone)
        .method("GET", null).addHeader("Authorization", "Zoho-oauthtoken 1000.xxxxxxxxxxxxxxxx.xxxxxxxxxxxxx")
        .addHeader("Content-Type", "application/json")
        .addHeader("Cookie",
                "1a9a93sda653=12a340a9c5d3e8sfd2161d0b; crmcsr=43sdv9-07ads5-4549-a166-0aad54gw6b; _zcsr_tmp=435e5334fa5-4549-a1667s889s8cf6b; JSESSIONID=54FF23B98378EBB45E4FA411823B5E61")
        .build();
System.out.println("request = " + request);
try 
    Response response = client.newCall(request).execute();
    String responseBody = response.body().string();
    Gson gson = new GsonBuilder().setPrettyPrinting().create();
    JsonParser parser = new JsonParser();
    JsonElement je = parser.parse(responseBody);
    String prettyJsonString = gson.toJson(je);
    JSONObject json = new JSONObject(prettyJsonString);

    System.out.println(i + "PrettyJson = " + prettyJsonString + "\n______________end of string________");
    JSONArray jsonArray = (JSONArray) json.get("data");
    JSONObject data0 = (JSONObject) jsonArray.get(0);
    JSONObject owner = (JSONObject) data0.get("Owner");
    String id = owner.getString("id");
    String id2 = data0.getString("id");
    DNC_ID[i] = id2;
    System.out.println("DNC_ID[" + i + "]= " + DNC_ID[i]);

 catch (Exception e) 
    // Need to search leads by name if phone number does not work
    // How to change the URL to search by name
    System.out.println("Entered catch clause: index = " + i);
    e.printStackTrace();

失败代码的输出:

request = Requestmethod=GET, url=https://www.zohoapis.com/crm/v2/Leads/search?phone=1234567890, tags=
    Entered catch clause: index = 0
    org.json.JSONException: A JSONObject text must begin with '' at 1 [character 2 line 1]
            at org.json.JSONTokener.syntaxError(JSONTokener.java:507)
            at org.json.JSONObject.<init>(JSONObject.java:222)
            at org.json.JSONObject.<init>(JSONObject.java:406)
            at com.App.main(App.java:103)

【问题讨论】:

【参考方案1】:

您的代码无法解析某些 JSON,它看起来不一定是因为搜索返回零结果。如果这是真的,它将返回一个空数组。仔细检查您的 JSON 形状并确保它们与 API 返回的内容相匹配。

此外,您似乎正在混合和匹配两个不同的 JSON 库。内置的 android 对象,如 JSONObject 和 Google 的 GSON 选择一个并坚持一个,不要混合和匹配它们。

为了帮助调试这一点,请使用内置日志系统的 OkHttps 并尝试设置不同的日志级别。

还可以设置OkHttp debug logging with an interceptor帮助调试。

Logger logger = LoggerFactory.getLogger(HttpUtil.class);
HttpLoggingInterceptor logging =
    new HttpLoggingInterceptor((msg) -> 
        logger.debug(msg);
    );
logging.setLevel(Level.BODY);

client.addNetworkInterceptor(logging);

【讨论】:

以上是关于我想使用 OkHttpClient 发出请求,如果响应不成功,我想更改 URL的主要内容,如果未能解决你的问题,请参考以下文章

添加自签名证书 OkHttpClient

android OkHttpClient 请求错误

OKHttp缓存有效期

okhttp3怎么设置代理

Android 头像上传至服务器 (OkHttpClient请求)

Android Studio OkHttpClient使用