开发项目过程中别组的同事用java调用我们的接口,接口是api形式的,上代码
[HttpPost] public LpdReturnDto Post([FromBody]UserAppend value) { return new LpdReturnDto(); }
UserAppend 为定义的一个类
他们调用的时候Post过来始终接收不到参数value的值。
有谁用过java调用webapi的吗?这样写有啥问题没有。
使用jquery的ajax调用没有问题
var d={"age":1}; $.ajax({ url: "http://localhost:60736/api/User", type: "POST", data: (d), success: function (data) { alert("post:" + data.status); } });
目前找到一个解决方法
byte[] byts = new byte[HttpContext.Current.Request.InputStream.Length]; HttpContext.Current.Request.InputStream.Read(byts, 0, byts.Length); string req = System.Text.Encoding.Default.GetString(byts);
最终获得的req就是post过来的值。
不知道还有没有更好的方法。
用Wireshark抓包看一下Java发过来的请求内容是什么?问题可能出在Java调用代码上
谢谢,不过这玩意不会用。
@webaspx: Java调用代码的问题,传的是json,应该用application/json,而不是application/x-www-form-urlencoded。
@dudu: 嗯,我现在在用jQuery模拟Java的调用传Json过来,但是未成功。
@webaspx: $.ajax中要加上
contentType:"application/json; charset=utf-8"
@dudu:
$.ajax({ url: "http://localhost:60736/api/User", type: "POST", dataType: 'json', contentType: 'application/json;charset=utf-8', data: JSON.stringify(d) , success: function (data) { alert("post:" + data.status); } });
加上了,后台还是接收不到
@webaspx: 不用value,换一个参数名称试试
@dudu: 还是不行。是否需要修改后台代码?
@webaspx: ASP.NET Web API的版本是多少?
@dudu: Microsoft.AspNet.WebApi.Core.5.2.3
@webaspx: 我们也是这样使用Web API的,没遇到这个问题。
@webaspx: 谢谢dudu,目前找到一个方法就流中读取。不知道有没有更好的方法处理。期待·~
@webaspx: 应该有更好的处理方法,UserAppend是如何定义的?
@dudu: 就是一个普通的类定义
@webaspx: 如果可以的话,提供一个能够重现这个问题的示例代码项目,我这边测试一下。
@dudu: 当然可以,一会发给您
@dudu: http://files.cnblogs.com/files/lvcao2099/WebapiDemo.7z
Demo已上传,您可以试试。
@webaspx: 收到,我试一下
@dudu: 晕死,刚把UserAppend上的[Serializable]标记给注释了就行了。
@dudu: 题外的问题,这是bug?
@webaspx: 我之前也怀疑到这个地方了,但是不确定,准备自己测试时试一下的。
@dudu: 好吧,不知道当时鬼使神差的就加上了那个标记了。
@webaspx: 我先记一下,应该是bug
@dudu: 谢谢dudu老大,终于解决问题了
可以明确的说就是调用的不会调...
我这边也有个同时做安卓的.不会调接口就说你接口做的有问题.o(︶︿︶)o 唉
@webaspx 看出问题了.是java的请求头正文格式不匹配
传输的是json格式,但是头里面确写form格式,webapi自然就解析不了
@吴瑞祥: 用jQuery测试,改成 contentType: 'application/json;charset=utf-8' 也是一样接收不到值。
@webaspx: 当然啦.因为jquery不是用json请求的啊.
抓包看一下java和ajax请求的差异在哪儿~
抓到不同了,Java掉用的时候是Json格式过来的,所以没接收到。
@webaspx: 那这就好解决啦,哈哈~话说Fiddle就可以抓了~
@幻天芒: 小弟现在头晕的不行,请赐教如何解决这问题?
@webaspx: http://ithelp.ithome.com.tw/question/10137046 看下这篇文章。自定义ValueProviderFactory 来解析json格式的请求。
@幻天芒: 网页无法打开
@webaspx:
2. 在App_Start建立ValueProviderConfig,註冊ValueProviderFactory
3. 在Global.asax加入啟動
@幻天芒: 谢谢,一会试试。