这段Java代码在C#中的等价物是什么?(setRequestEntity)
有一个用Java开发的HTTP服务器,它利用了这段Java代码在C#中的等价物是什么?(setRequestEntity),java,c#,Java,C#,有一个用Java开发的HTTP服务器,它利用了HttpServletRequest,HttpServletResponse等。。在这个服务器中,有一个方法被“POST”调用,并接收一个参数,一个巨大的字符串 通常,此方法由Java应用程序调用,并且工作正常,用于调用的代码如下: MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); PostMethod po
HttpServletRequest
,HttpServletResponse
等。。在这个服务器中,有一个方法被“POST”调用,并接收一个参数,一个巨大的字符串
通常,此方法由Java
应用程序调用,并且工作正常,用于调用的代码如下:
MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
PostMethod post = new PostMethod(this.serverUrl);
post.setRequestEntity(new CrossTalkRequestEntity(msg));
HttpClient cli = new HttpClient(connectionManager);
int code = cli.executeMethod(post);
要发送的参数是msg
变量,请注意没有指定的参数来执行POST
问题是:当我尝试向此服务器发送帖子时,如果没有命名参数,我无法发送我的字符串参数,以下代码是服务器获取参数值的方式:
requestMessage = JaxbHelper.createContextAndUnmarshal(CrossTalkMessage.class, request.getInputStream());
请注意,服务器没有通过名称获取参数,它只是调用request.getInputStream()
并获取值
我已经尝试了很多方法来实现这一点,现在我尝试使用下面的方法进行调用,但它不起作用,因为我传递的是一个命名参数值
,而不是像Java调用那样设置请求实体(setRequestEntity
)
如何在c
中调用此HTTP服务器并像Java
do那样传递参数
编辑
有类的代码CrossTalkRequestEntity
:
class CrossTalkRequestEntity implements RequestEntity {
private final byte[] data;
CrossTalkRequestEntity(CrossTalkMessage msg) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
JaxbHelper.createContextAndMarshal(CrossTalkMessage.class, msg, out);
} finally {
try {
out.flush();
out.close();
} catch (IOException e) {
}
}
this.data = out.toByteArray();
}
@Override
public boolean isRepeatable() {
return true;
}
@Override
public void writeRequest(OutputStream out) throws IOException {
out.write(data);
}
@Override
public long getContentLength() {
return data.length;
}
@Override
public String getContentType() {
return "text/xml";
}
}
在深入研究代码之后,问题在于请求的内容类型,原始Java代码以“text/xml”的形式发送内容,而C#代码以“application/x-www-form-urlencoded”的形式发送内容
将ContentType更改为“text/xml”,它将起作用。您是否尝试过执行byte[]byteArray=Encoding.UTF8.GetBytes(数据)
而不是byte[]byteArray=Encoding.UTF8.GetBytes(“value=“+data”)代码>?是的,我有。当我尝试此操作时,data
的值会像参数一样继续发送,但会使用另一个名称(因为在data
变量的内容中有一个foo=bar
字符串)同样,在Java示例中,您正在嵌入整个对象,“new CrossTalkRequestEntity(msg)”。。。我猜你的接收者想反序列化这个?因此,您需要在C#中构造一个类似的obj,并将其流附加到msg中,然后将其删除。我怀疑问题在于将内容序列化为字符串的方式。您可以添加用于将类序列化为JSON的代码吗?@RichardTyregrim这不是重点。关键是:当服务器执行request.getInputStream()
时,他不会获取我的参数CrossTalkRequestEntity
只是一个继承自RequestEntity
Java类并返回字节[]
的类。
class CrossTalkRequestEntity implements RequestEntity {
private final byte[] data;
CrossTalkRequestEntity(CrossTalkMessage msg) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
JaxbHelper.createContextAndMarshal(CrossTalkMessage.class, msg, out);
} finally {
try {
out.flush();
out.close();
} catch (IOException e) {
}
}
this.data = out.toByteArray();
}
@Override
public boolean isRepeatable() {
return true;
}
@Override
public void writeRequest(OutputStream out) throws IOException {
out.write(data);
}
@Override
public long getContentLength() {
return data.length;
}
@Override
public String getContentType() {
return "text/xml";
}
}