来自Android的REST服务:400例外

时间:2014-04-18 13:44:11

标签: android web-services rest http-basic-authentication

我对Android开发非常陌生,所以如果我的尝试不是100%正确的话,请原谅。

在JavaScript中,我有一个连接到WCF服务的函数,使用基本身份验证,来检索所请求的PDF文档的base64编码字符串。下面的JavaScript有效:

function svcPost(param) {
    return jQuery.ajax({
        type: 'POST',
        url: 'https://url-to-service.svc/' + param.method,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        data: JSON.stringify(param.json),
        async: true,
        processData: true,
        crossDomain: true,
        beforeSend: function (request) {
            request.setRequestHeader("Authorization", "Basic " + window.localStorage.getItem('credentials'));
        },
        success: function(result) {
            return result;
        },
        error: function (xhr, status, error) {
            return error;
        }
    });
};

然后在promise中调用此函数以返回上述base64编码的字符串:

jQuery.when(
        svcPost({ method: 'GetBase64Pdf', json: { id: lookupId } })
    )
    .done(function (result) {
        deferred.resolve(result[0]);
    })
    .fail(function(error) {
        console.error(error);
    });

我试图在Android应用程序中复制它,我没有运气。每次调用该服务都会返回400 BAD REQUEST,表示该调用期望带有'value'的'type',但是找到null。

我知道这与' dataType:'json''有关,但我似乎无法在Android中使用它。

到目前为止我的代码:

byte[] bytes = "Username:Password1".getBytes("UTF-8");
String encoded = Base64.encodeToString(bytes, 0);
String itemid = Integer.toString(lookupId);

String param = "id=" + URLEncoder.encode(itemid, "UTF-8");
String url = "https://url-to-service.svc/GetBase64Pdf";

URL uri = new URL(url);
HttpURLConnection connection = (HttpURLConnection)uri.openConnection();

try {
    connection.setRequestMethod("POST");                        
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.setRequestProperty("Content-Length", Integer.toString(param.getBytes().length));
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Authorization", "Basic " + encoded);     

connection.setDoOutput(false);
connection.setUseCaches(false);
connection.setDoInput(true);

DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.writeBytes(param);
wr.flush();
wr.close();

InputStream in = null;

int status = connection.getResponseCode();

if (status >= HttpStatus.SC_BAD_REQUEST) {
    in = connection.getErrorStream();
}
else {
    in = connection.getInputStream();
}

BufferedReader rd = new BufferedReader(new InputStreamReader(in));
String line;
StringBuffer response = new StringBuffer();

while ((line = rd.readLine()) != null) {
    response.append(line);
    response.append('\r');
}

rd.close();

我尝试添加'接受'作为' dataType:'json'的标题条目,但这不起作用。

如果我将'& type = json '添加到参数字符串中,它会将错误消息作为json数组返回。

有什么遗漏?我无法访问WCF服务,它是客户端环境中的第三方呼叫,因此我无法检查服务本身。 JavaScript可以工作,但我不能在Android中复制JavaScript实现。

任何帮助都将不胜感激,我已经在这里扯了几个小时,没有我读过的博客取得了任何成功:(。

1 个答案:

答案 0 :(得分:0)

您需要将doOutput设置为true:

connection.setDoOutput(true);

您将其设置为false,因此不会发送任何输出(request-body)。