有一个用Java开发的HTTP服务器利用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。
问题是:当我尝试对此服务器执行POST时,我无法在没有命名参数的情况下发送string
参数,以下代码是服务器获取参数值的方式: / p>
requestMessage = JaxbHelper.createContextAndUnmarshal(CrossTalkMessage.class, request.getInputStream());
看看服务器没有按名称获取参数,只需调用request.getInputStream()
并获取值。
我已经尝试了很多方法来实现这一点,现在我正在尝试使用下面的方法调用,但它无法正常工作,因为我传递了一个命名参数value
而没有设置请求实体像Java调用(setRequestEntity
)。
public static string Post(string address, string data)
{
string responseFromServer = string.Empty;
WebResponse response = null;
WebRequest request = WebRequest.Create(address);
request.Method = "POST";
byte[] byteArray = Encoding.UTF8.GetBytes("value=" + data);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
var dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
response = request.GetResponse();
dataStream = response.GetResponseStream();
using (var reader = new StreamReader(dataStream))
{
responseFromServer = reader.ReadToEnd();
}
response.Close();
}
如何在c#
中调用此HTTP服务器并传递Java
这样的参数?
修改
有类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";
}
}
答案 0 :(得分:1)
在您的代码上挖掘一下后,问题就是您的请求的内容类型,您的原始Java代码将内容发送为“text / xml”,而您的C#代码将其发送为“application / x-www-form- urlencoded的”。
将ContentType更改为“text / xml”,它将起作用。