【问题标题】:C# HttpClient PostAsync won't work with django rest frameworkC# HttpClient PostAsync 不适用于 django rest 框架
【发布时间】: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 收到&lt;QueryDict: {}&gt;

而且这只发生在 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 的解决方案,仍然无法正常工作..
  • 然后确保在服务器端检查您在请求中收到的标头。

标签: c# django xamarin django-rest-framework httpclient


【解决方案1】:

我根本不懂C#,但根据其他帖子(httpclient call to webapi to post data not workingHttpClient is not posting form data),您可能需要在StringContent 中设置更多信息:

StringContent(content, Encoding.UTF8, "application/json")

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 2014-12-31
    • 1970-01-01
    • 2018-01-09
    • 2017-11-27
    • 1970-01-01
    • 2018-10-02
    • 2021-09-28
    • 2019-07-11
    相关资源
    最近更新 更多