1

我正在开发一个项目,该项目需要我向 http://sagecell.sagemath.org/kernel发送一个帖子请求(只是一个帖子,没有数据)以及两个额外的标头,Accept-Encoding:identity 和accepted_tos:true .

如果像这样使用默认的 httpClient,这可以正常工作:

httpClient = new DefaultHttpClient();

HttpPost httpPost = new HttpPost();

String url = UrlUtils.getKernelURL();

httpPost.setURI(URI.create(url));

ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair(HEADER_ACCEPT_ENCODING,VALUE_IDENTITY));
postParameters.add(new BasicNameValuePair(HEADER_TOS,"true"));
httpPost.setEntity(new UrlEncodedFormEntity(postParameters));

HttpResponse httpResponse = httpClient.execute(httpPost);
InputStream inputStream = httpResponse.getEntity().getContent();

webSocketResponse = gson.fromJson(new InputStreamReader(inputStream), WebSocketResponse.class);
inputStream.close();

但是,如果我想使用 OkHttpClient 使用相同的东西,它会给我一个 403 错误:

httpClient = new OkHttpClient();

public static final MediaType jsonMediaType = MediaType.parse("application/json; charset=utf-8");

RequestBody body = RequestBody.create(jsonMediaType, "");

Request request = new Request.Builder()
        .addHeader(HEADER_ACCEPT_ENCODING, VALUE_IDENTITY)
        .addHeader(HEADER_TOS, "true")
        .url(url)
        .post(body) //I've tried null here as well
        .build();

Response response = httpClient.newCall(request).execute();

Log.i(TAG,"STATUS CODE"+response.code()); //This is 403

这与 Ion 甚至 HttpUrlConnection 等库的情况相同,只有 Apache 客户端似乎可以工作。

任何关于为什么这不起作用的答案将不胜感激。

4

2 回答 2

0

您的请求正文为空。您应该提供表单编码的请求正文或 JSON 请求正文以及相应的内容类型。

如果你愿意,MimeCraft会为你构建一个表单编码的请求体,而Gson会做 JSON。

于 2014-06-03T14:50:01.980 回答
0

错误 403 表示它被服务器禁止。在第一种情况下(使用默认 httpclient 时),您没有添加标头,您只是向实体添加了一个名称-值对。添加你应该使用的标题

httpPost.addHeader("key","value");
于 2014-06-03T09:46:35.803 回答