【问题标题】:retrofit 1.9 keeps calling failure and returns null body改造 1.9 不断调用失败并返回空正文
【发布时间】:2016-02-24 17:05:42
【问题描述】:

我正在尝试与我的 php 网络服务(谷歌应用程序引擎)进行通信,但它一直以 body 作为 null 并触发改造(回调)的 failure() 方法。

在调试时,我在 failure() 中收到以下错误消息:

retrofit.RetrofitError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

首先是我触发对我的网络服务的请求的代码:

 WebServiceManager.getInstance().registerRequest(email, password, username, firstname, lastname, new Callback<RegisterResponse>() {
                        @Override
                        public void success(RegisterResponse registerResponse, Response response) {
                            Toast.makeText(context, registerResponse.getToken() + "", Toast.LENGTH_LONG).show();
                        }

                        @Override
                        public void failure(RetrofitError error) {
                            Toast.makeText(context,"error ", Toast.LENGTH_LONG).show();
                        }
                    });

这是用于管理请求和响应的 WebServiceManager 类: http://pastebin.com/Q8bzqQ0M

请求和响应的模型类: http://pastebin.com/aB98Yiua

这就是我的 json 请求的样子:

{
    data{
        "email": "regd@rgersf.dk",
        "firstname": "regdrgersf",
        "lastname": "regdrgersf",
        "password": "hejhejhej",
        "username": "regdrgersf"
    }
}

我也认为在我的网络服务上包含我收到请求的部分是相关的:

<?php
require '../functions/db.php';

$data = getJsonRequest();

$email      = $data['data']['email'];
$password   = $data['data']['password'];
$username   = $data['data']['username'];
$firstname  = $data['data']['firstname'];
$lastname   = $data['data']['lastname'];
$facebookID = $data['data']['facebookID'];

$dbClass = new DBClass();
$result = $dbClass->register($email, $password, $username, $firstname, $lastname, $facebookID);

$response = array();
if ($result == $dbClass->error_input || $result == $dbClass->error_email_exists || $result == $dbClass->error_unknown || $result == $dbClass->error_db_connection) {
    $response['status'] = false;
    $response['error'] = $result;

} else {
    $response['status'] = true;
    $response['token'] = $result;
}

sendJsonResponse($response);

?>

以及发送响应的函数“sendJsonResponse($response)”:

function sendJsonResponse($response) {
    header('HTTP/1.1 200 OK');
    header('Content-type: application/json');

    echo json_encode($response);
}

我无法确定问题是在我的 java (android) 代码和改造中的某个地方,还是我在网络服务器上做错了什么。

任何帮助将不胜感激。

【问题讨论】:

  • 你的 json 有问题,但我看不出你在哪里设置。
  • 这个异常非常具有描述性,Retrofit 期望像 {"key":"value"} 这样的 JSON 对象,但响应是一个简单的字符串。您可以使用 .setLogLevel(RestAdapter .LogLevel.FULL) 在您的 RestAdapter.Builder()
  • 你能发布你的 PHP 输出的 JSON 吗?
  • @nasch 我在我的问题中的 pastebin 链接提供的代码中设置它。它是方法 registerRequest(...)
  • @luciofm 我将日志级别设置为 .setLogLevel(RestAdapter.LogLevel.FULL),这可以在问题中提供的 pastebin 链接中看到.. 但我不知道我是不是虽然这样做是错误的

标签: php android json web-services retrofit


【解决方案1】:

我自己找到了一种解决方法,所以我认为我应该在此处发布我的解决方案,以便对其他人有所帮助.. 即使我不确定为什么我的第一个解决方案不起作用。 通过删除注释@FormUrlEncoded 并将@Field('data') 更改为@Body,它确实有效。 Så 界面现在是这样的。

private interface webServiceInterface {
    @POST(WebServiceManager.REQUEST_REGISTER)
    void register(@Body RegisterRequest registerRequest, Callback<RegisterResponse> response);
}

无论如何,我非常感谢这里的人们给予我的所有帮助。

【讨论】:

    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2015-06-24
    • 2014-08-13
    • 2017-08-08
    相关资源
    最近更新 更多