【问题标题】:Is OkHttp equivalent code really OK in Postman?OkHttp 等效代码在 Postman 中真的可以吗?
【发布时间】: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)

【问题讨论】:

    标签: android postman okhttp


    【解决方案1】:

    所以 3 天后我发现了问题,服务器 API 没有提到 URL 端点必须以 / 结尾,即使在他们的示例代码中他们也没有使用。

    似乎Postman 和 Python requests 在需要时都在URL 的末尾使用/,但Postman 至少在生成的等效代码中没有提到这一点。 OkHttp 也不会以相同的方式运行。

    但是使用尾随 / 解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多