Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';得不到OkHttp';s response.body.toString()返回字符串_Java_Android_Okhttp - Fatal编程技术网

Java Can';得不到OkHttp';s response.body.toString()返回字符串

Java Can';得不到OkHttp';s response.body.toString()返回字符串,java,android,okhttp,Java,Android,Okhttp,我正在尝试使用OkHttp获取一些json数据,但当我尝试记录response.body().toString()结果时,我不明白为什么:﹕ com.squareup.okhttp.Call$RealResponseBody@41c16aa8 try { URL url = new URL(BaseUrl); OkHttpClient client = new OkHttpClient(); Request request = new Reques

我正在尝试使用OkHttp获取一些json数据,但当我尝试记录
response.body().toString()
结果时,我不明白为什么:﹕ com.squareup.okhttp.Call$RealResponseBody@41c16aa8

try {
        URL url = new URL(BaseUrl);
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .header(/****/)
                .build();

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

        **//for some reason this successfully prints out the response**
        System.out.println("YEAH: " + response.body().string());

        if(!response.isSuccessful()) {
            Log.i("Response code", " " + response.code());
        }

        Log.i("Response code", response.code() + " ");
        String results = response.body().toString();

        Log.i("OkHTTP Results: ", results);

我不知道我做错了什么。如何获取响应字符串?

您已经使用
.string()
函数在
System.out.println()中打印响应。但最后在
Log.i()
中,您使用的是
.toString()

因此,请在响应正文上使用
.string()
打印并获取您的请求的响应,如:

response.body().string();
注意:

  • .toString()
    :以字符串格式返回对象

  • .string()
    :这将返回您的响应


  • 我想这可以解决你的问题。。。对。

    以防万一有人碰到和我一样的怪事。我在开发过程中以调试模式运行代码,显然是从OKHTTP2.4开始的

    ..响应主体是一个一次性值,只能消耗一次


    因此,在调试时,有一个来自检查器的“幕后”调用,并且主体总是空的。请参阅:

    响应.body、.string()
    只能使用一次。 请按以下方式使用:

    String responseBodyString = response.body.string();
    use the responseBodyString as needed in your application.
    

    尝试这样更改,例如:

    protected String doInBackground(String... params) {
                try {
                    JSONObject root = new JSONObject();
                    JSONObject data = new JSONObject();
                    data.put("type", type);
                    data.put("message", message);
                    data.put("title", title);
                    data.put("image_url", imageUrl);
                    data.put("uid",uid);
                    data.put("id", id);
                    data.put("message_id", messageId);
                    data.put("display_name", displayName);
                    root.put("data", data);
                    root.put("registration_ids", new JSONArray(receipts));
                    RequestBody body = RequestBody.create(JSON, root.toString());
                    Request request = new Request.Builder()
                            .url(URL)
                            .post(body)
                            .addHeader("Authorization", "key=" + serverKey)
                            .build();
                    Response response = mClient.newCall(request).execute();
                    String result = response.body().string();
                    Log.d(TAG, "Result: " + result);
                    return result;
                } catch (Exception ex) {
                    Log.e(TAG,"Exception -> "+ex.getMessage());
                }
                return null;
            }
    

    假设在大文件的情况下,响应可能会产生
    OutOfMemoryError
    ,您可以使用字节数“窥视”正文,并调用
    string()
    方法

    请注意,这将消耗身体


    response.peekBody(500.string())

    在使用字符串后重新创建响应对象


    val responseBodyString=response.body()!!。字符串()

    response=response.newBuilder() .body(ResponseBody.create(ResponseBody?.contentType(),ResponseBody.toByteArray())
    .build()。检查intercept函数的结尾,在那里我在使用旧响应后重新创建响应对象

    var responseBodyString=responseBody?.string()

    response=response.newBuilder() .身体( ResponseBody.create( responseBody?.contentType(), responseBodyString.toByteArray() ) ) .build()

    类拦截器:拦截器
    {
    var gson=GsonBuilder().setPrettyPrinting().create()
    覆盖有趣的拦截(链:Interceptor.chain):响应{
    Timber.d(“***->>对服务器的请求->***”)
    val request=chain.request()
    var响应=链。继续(请求)
    var curl=“curl-v-X${request.method()}”
    val headers=request.headers()
    对于(0中的i..(headers.size()-1)){
    curl=“${curl}-H\”${headers.name(i)}:${headers.value(i)}”
    }
    val requestBody=request.body()
    if(requestBody!=null){
    val buffer=buffer()
    requestBody.writeTo(缓冲区)
    var字符集:字符集=
    字符集forName(“UTF-8”)
    curl=“${curl}--data'${buffer.readString(charset.replace(“\n”,“\\n”)}”
    }
    Timber.d(“$curl${request.url()}”)
    d(“响应状态代码${response.code()}消息:${response.message()}”)
    (回应)
    var responseBody=响应?.body()
    if(responseBody!=null)
    {
    var responseBodyString=responseBody?.string()
    response=response.newBuilder()
    .身体(
    ResponseBody.create(
    responseBody?.contentType(),
    responseBodyString.toByteArray()
    )
    )
    .build()
    responseBodyString=gson.toJson(responseBodyString)
    Timber.d(“响应json->\n$responseBing”)
    }
    
    Timber.d(“*****可能是你的复制品,只需打印一个对象,然后跟踪确认即可。阅读文档。你要寻找的方法是
    string
    val responseBodyString=response.body()!!.string()response=response.newBuilder().body(ResponseBody.create(ResponseBody?.contentType()),responseBodyString.toByteArray()).build()在不使用响应正文的情况下如何调用
    .string()
    ?不确定是否可以调用.string()不使用响应体,但作为一种解决方法,但您可以遵循okhttp的日志侦听器用于执行此操作的模式:这意味着我们无法调试okhttp响应体您可以打印响应体以使用debug Disabled进行日志记录这是一种邪恶的行为!我知道这类注释是多么没有帮助,但我要感谢您o更多字符串()函数,现在怎么办?@eCDroid“No more string()function”您确定吗?根据文档“自动关闭响应库”。`您需要记住,调用此方法后将无法读取响应这解决了我的问题。thnx这可能会触发大响应(即zip文件)的OutOfMemory错误不鼓励只使用代码的答案。请单击并添加一些文字,总结您的代码如何解决问题,或者解释您的答案与以前的答案有何不同。谢谢,非常感谢!!!!!挽救了我的一天
    class CurlInterceptor: Interceptor
    {
    
        var gson = GsonBuilder().setPrettyPrinting().create()
    
        override fun intercept(chain: Interceptor.Chain): Response {
    
        Timber.d(" **** ->>Request to server -> ****")
    
        val request = chain.request()
        var response = chain.proceed(request)
    
        var curl = "curl -v -X  ${request.method()}"
    
        val headers = request.headers()
    
        for ( i in 0..(headers.size() -1) ){
            curl = "${curl} -H \"${headers.name(i)}: ${headers.value(i)}\""
        }
    
        val requestBody = request.body()
        if (requestBody != null) {
            val buffer = Buffer()
            requestBody.writeTo(buffer)
            var charset: Charset =
                Charset.forName("UTF-8")
            curl = "${curl} --data '${buffer.readString(charset).replace("\n", "\\n")}'"
        }
    
        Timber.d("$curl ${request.url()}")
        Timber.d("response status code ${response.code()} message: ${response.message()}")
    
        
        dumbHeaders(response)
    
        var responseBody = response?.body()
    
        if(responseBody != null )
        {
            var responseBodyString = responseBody?.string()
    
                response = response.newBuilder()
                    .body(
                        ResponseBody.create(
                            responseBody?.contentType(),
                            responseBodyString.toByteArray()
                        )
                    )
                    .build()
    
    
            responseBodyString = gson.toJson(responseBodyString)
    
            Timber.d("response json -> \n $responseBodyString")
    
        }
    
        Timber.d(" **** << Response from server ****")
    
        return response
    }
    
    
    
    fun dumbHeaders(response: Response) {
        try {
            if (response.headers() != null) {
    
                for (headerName in response.headers().names()) {
                    for (headerValue in response.headers(headerName)) {
                        Timber.d("Header $headerName : $headerValue")
                    }
                }
            }
        }
    catch (ex: Exception){}
    }
    }