【问题标题】:Why converting C# HTTP Request to Java did not work?为什么将 C# HTTP 请求转换为 Java 不起作用?
【发布时间】:2019-02-04 10:14:12
【问题描述】:

我正在尝试使用 Microsoft 自定义视觉know more。我需要发出 HTTP 请求来发送要分析的图像。我成功地从 C# 发出请求,所以我知道信息是正确的。

但是,当我尝试在 Java 中发出相同的请求时,我收到了 HTTP 400 错误。

我认为我没有在 Java 中正确处理请求。这是真的吗?

下面是sn-ps。

C#:

var client = new HttpClient();
client.DefaultRequestHeaders.Add("Prediction-Key", PredicitionKey);
using (var content = new 
ByteArrayContent(byteData))
{
  content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
  response = await client.PostAsync(url, content);
  Console.WriteLine(await response.Content.ReadAsStringAsync());
}

Java:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Prediction-Key", predicitionKey);
connection.setRequestProperty("Content-Type", "application/octet-stream");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.getOutputStream().write(data.getData());
connection.connect();

Reader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));

【问题讨论】:

  • 请运行 Fiddler 或 Wireshark 或其他工具来比较两个代码示例提交的确切请求。
  • @mjwills 我现在会这样做,但 java 中的 html 请求结构是否正确。这是第一次使用它们,我有点不确定。

标签: java c# http-headers


【解决方案1】:

首先,替换

connection.connect();

connection.getResponseCode();

如果它仍然不起作用,那么标题就是问题所在。

由于C#代码运行成功

您的 C# 请求和 fiddler 中的 Java 请求之间的唯一区别是 Java 请求有两个额外的标头(Accept、User-Agent)。

尝试明确设置它们

connection.setRequestProperty("Accept", "*/*");
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");

如果仍然不起作用,请尝试删除这两个标头或检查您在请求正文中发送的数据。

【讨论】:

  • 感谢 将数据解析为字节数组时出现问题。以及需要用getresponseCode替换的connect
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 2018-09-20
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2017-06-25
相关资源
最近更新 更多