C# HttpClient PostAsync 不适用于 django rest 框架
Posted
技术标签:
【中文标题】C# HttpClient PostAsync 不适用于 django rest 框架【英文标题】:C# HttpClient PostAsync won't work with django rest framework 【发布时间】:2017-02-26 13:44:30 【问题描述】:在 Django (DRF) 中
在 test.views.py 中
class TestAPIView(APIView):
permission_classes = (AllowAny,)
def post(self, request, format=None):
print(request.data)
return Response(request.data)
在 test.urls.py 中
from django.conf.urls import url
from .views import TestAPIView
urlpatterns = [
url(r'^test/$', view=TestAPIView.as_view()),
]
如您所见,我的测试 url 应该返回帖子数据。 并且在可浏览的 api 和 Unity WWW 中运行良好(类似于统一提供的 httpclient)。
但它不适用于 HttpClient PostAsync(或 SendAsync)
这是我的 C# 代码
在 Xamarin/C# 中
Post newPost = new Post Title = "asdfasfa", Content = "asdfasffasf" ;
var content = JsonConvert.SerializeObject(newPost);
Debug.WriteLine(content);
var response = await _client.PostAsync("http://127.0.0.1:8000/test/", new StringContent(content));
var responseString = await response.Content.ReadAsStringAsync();
Debug.WriteLine(responseString);
以及来自控制台的结果......
在 C# 控制台中
注释的字符串是我写的。不是来自控制台
"Id":0,"Title":"asdfasfa","Content":"asdfasffasf" // <- this is the sent data.
Thread started: #6
Thread started: #16
Thread started: #17
// <- and the received data
还有……
在 Django(DRF) 控制台中
[26/Feb/2017 13:37:34] "POST /test/ HTTP/1.1" 200 2
<QueryDict: >
我的帖子数据哪里去了???
django 收到<QueryDict: >
而且这只发生在 httpclient 上。也许只有 django。 我用 => https://jsonplaceholder.typicode.com/posts 对其进行了测试 并且帖子创建工作正常。
可能是 Django 问题,可能是 C# 问题,我不知道... 请帮忙!
ps?。 HttpWebRequest 也可以正常工作。
【问题讨论】:
您是否将 8000 端口转发到您的 Django 主机,因为127.0.0.1
是设备/模拟器的本地主机(假设此代码在设备/模拟器上运行,因为您有它标记为 Xamarin)....
您需要使用您的服务器的 IP 或 FQDN。使用环回地址将连接到您的应用正在运行的 DEVICE/EMULATOR,而不是服务器
检查您发送到服务器的内容类型。由于您在没有指定 mediaType 构造函数参数的情况下使用 StringContent - 我猜它会是“text\plain”,但您正在尝试传递 json 数据,所以应该是“application\json”
这真的与地址/模拟器/互联网配置无关,因为它与 HttpWebRequest.+ 一起工作得很好,同时使用 RestSharp 我发现了一些有趣的东西。当我将数据作为 json 提供时,它不会收到,但是使用 addparameter(balbla),效果很好。我猜测它的媒体类型或一些问题,但尝试使用@Evk 的解决方案,仍然无法正常工作..
然后确保在服务器端检查您在请求中收到的标头。
【参考方案1】:
我根本不懂C#,但根据其他帖子(httpclient call to webapi to post data not working 或HttpClient is not posting form data),您可能需要在StringContent
中设置更多信息:
StringContent(content, Encoding.UTF8, "application/json")
【讨论】:
以上是关于C# HttpClient PostAsync 不适用于 django rest 框架的主要内容,如果未能解决你的问题,请参考以下文章
HttpClient postasync,带有自定义标头和应用程序/json,用于正文 C#
C# HttpClient PostAsync 将 204 变成 404
使用 HttpClient PostAsync 发送 C# NameValueCollection 问题
C# HttpClient PostAsync 不适用于 django rest 框架