HTTP Post Only适用于默认的HttpClient,而不适用于OkHttpClient

时间:2014-06-03 06:48:36

标签: android httpclient okhttp

我正在处理一个项目,要求我发送一个帖子请求 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 Client似乎有效。

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

2 个答案:

答案 0 :(得分:0)

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

httpPost.addHeader("key","value");

答案 1 :(得分:0)

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

如果您愿意,MimeCraft将构建一个表单编码的请求正文,Gson将执行JSON。