【发布时间】:2017-10-30 20:41:06
【问题描述】:
我正在尝试向某个 API 发送一个 json 发布请求,该 API 作为响应发送一个二进制文件。
我在Postman做得很好:
标题:
正文和结果:
我从Postman 中的Code 部分为Java/OKHTTP 获得以下代码
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n \"Text\":\"Hello\",\r\n \"APIKey\":\"MY_API_KEY\",\r\n \"Speaker\":\"Female1\",\r\n \"Format\":\"mp3/32/m\",\r\n \"Quality\":\"quality/normal\"\r\n}");
Request request = new Request.Builder()
.url("http://url/CloudService/ReadText")
.post(body)
.addHeader("content-type", "application/json")
.addHeader("cache-control", "no-cache")
.addHeader("postman-token", "0a1ce7c9-7a95-a2b9-7cde-8a7e6ce58386")
.build();
Response response = client.newCall(request).execute();
但是当我在 android 中使用上面的代码时它失败了,我确定我获得了 Internet 权限并且代码在 AsyncTask 内执行。
我不是在询问 API 或如何向某些 API 发送 json Post 请求并获取二进制文件作为响应。我用过client.newCall(request).enqueue(new Callback(){//stuff here});,但没有一个有效。作为回应,我得到了 307 状态码(而不是 Postman 中的 200)并且根本没有二进制数据。 API 非常不清楚,对失败只字未提,我仍在努力。
我只想问Postman 是否正确地为OkHttp 生成等效代码?如果不是,您对Java/OkHttp 中的此请求有什么建议?
再举一个例子,下面的Pythonrequests脚本也可以做同样的工作:
url = 'http://url/CloudService/ReadText'
api_key = 'MY_API_KEY'
body = {
'Text': 'Hello',
'Speaker': 'Female1',
'Format': 'mp3/32/m',
'Quality': 'quality/normal',
'APIKey': api_key
}
header = {
'Content-type': 'application/json'
}
r = requests.post(url, data=json.dumps(body), headers=header)
【问题讨论】: